Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Корректность имени файла. Как проверить?   Найти похожие ветки 

 
CaptainAlex   (2005-10-18 13:07) [0]

Вводит нам пользователь имя файла в TEdit и говорит - а создай-ка мне такой файл. Есть ли стандартные средства для проверки его (имени) корректности.


 
Ega23 ©   (2005-10-18 13:15) [1]

А что значит корректность?
Имя \\DBSrv\Data\test1.txt  - корректно или нет?


 
Andy BitOff ©   (2005-10-18 13:21) [2]

Да был уже такой вопрос, давано правда, растянули там тягомотину всякую.

По сабжу, возьми и создай файл. Будет ошибка, проверь какая и все. Если ошибки нет, значит все чики-пуки.


 
Loginov Dmitry ©   (2005-10-18 13:26) [3]

Можно например так проверить:

for I := 1 to Length(Edit1.Text) do
  if Edit1.Text[I] in ["\", "/", ":" и т.д.] then
    Halt();


 
Ega23 ©   (2005-10-18 13:48) [4]

2 Loginov Dmitry ©   (18.10.05 13:26) [3]

> Можно например так проверить:


Иногда лучше жевать, чем говорить


 
CaptainAlex   (2005-10-18 17:44) [5]

вот так сделал пока:
procedure TfrmProject.edtProjectNameKeyPress(Sender: TObject;
 var Key: Char);
var
 c: char;
begin
 c := chr(0);
 if Key = "." then Key := c;
 if Key = ";" then Key := c;
 if Key = ":" then Key := c;
 if Key = "/" then Key := c;
 if Key = "\" then Key := c;
 if Key = "$" then Key := c;
 if Key = "%" then Key := c;
 if Key = "@" then Key := c;
 if Key = "!" then Key := c;
 if Key = "?" then Key := c;
 if Key = "*" then Key := c;
 if Key = "^" then Key := c;
 if Key = "&" then Key := c;
 if Key = "(" then Key := c;
 if Key = ")" then Key := c;
 if Key = "-" then Key := c;
 if Key = "=" then Key := c;
 if Key = "+" then Key := c;
 if Key = "[" then Key := c;
 if Key = "]" then Key := c;
 if Key = "{" then Key := c;
 if Key = "}" then Key := c;
 if Key = """" then Key := c;
 if Key = """ then Key := c;
 if Key = " " then Key := c;
 if Key = "#" then Key := c;
 if Key = "`" then Key := c;
 if Key = "~" then Key := c;
 if Key = "<" then Key := c;
 if Key = ">" then Key := c;
 if Key = "," then Key := c;
end;


 
Джо ©   (2005-10-18 17:47) [6]


>  [5] CaptainAlex   (18.10.05 17:44)
> вот так сделал пока:

8-()
Кстати, а почто обидел + ~ - ( ) и прочие?


 
CaptainAlex   (2005-10-18 17:56) [7]


> 8-()
> Кстати, а почто обидел + ~ - ( ) и прочие?


У меня это имя программы в скрипте кроме прочего. Так что в моем случае это нужно именно в этом виде.А если говорить за имя файла в файловой системе, то таки да, треть символов из списка нужно исключить.


 
Джо ©   (2005-10-18 18:04) [8]


>  [7] CaptainAlex   (18.10.05 17:56)

Тогда причем здесь "корректность имени файла" в постановке вопроса?


 
Джо ©   (2005-10-18 18:05) [9]

ЗЫ. Если на то пошло, слышал о set"ах?


 
Gugle ©   (2005-10-18 18:05) [10]

А не проще в SaveDialog поставить ofNoValidate = true ?!?

Зачем такие проблемы если есть все стандартное?


 
CaptainAlex   (2005-10-18 18:21) [11]

Ну так с самого начала и спрашивал про стандартное решение...


 
Fay ©   (2005-10-18 18:52) [12]

2 CaptainAlex   (18.10.05 17:44) [5]

Из приведённого кода следует, что Key может иметь несколько значений одновременно.
Странно это очень.

И как возникла такая необходимость делать с переменной?


 
begin...end ©   (2005-10-18 18:53) [13]

> CaptainAlex   (18.10.05 17:44) [5]

"У меня от Вас появляются седые волосы"
(с) моя школьная учительница физики

:-)


 
CaptainAlex   (2005-10-18 19:00) [14]

Ну да, да :) Я знаю. Я все знаю. И про множества и про переменную. Я подход иллюстрирую. Это черновой код, к тому же отвратительно написанный.
Я спрашивал про альтернативу такому подходу :)


 
Джо ©   (2005-10-18 19:21) [15]


> [14] CaptainAlex   (18.10.05 19:00)

Ты тут намешал разного-всякого.

Требование № 1: имя файла должно быть допустимое "имя программы в скрипте ".
Требование № 2: имя файла должно быть допустимым с точки зрения файловой системы.

Решение.
Определить допустимые символы в названии "программы в скрипте". Для простоты положим, что это любые символы латинского алфавита. Тогда для каждого Ch должно быть справедливо: UpperCase(Ch) in ["A".."Z"]; Первый вопрос решили.
Решение требования номер 2 сводится к тому, чтобы вызвать функцию сохранения (в том или ином виде) и проанализировать код возврата. И вывести соответствующее предупреждение в случае неуспешного завершения операции.


 
Fay ©   (2005-10-18 19:23) [16]

function TestFileName(const s : string) : Boolean;
var
 h : THandle;
begin
 h := CreateFile(PChar(ExtractFilePath(Application.ExeName) + s), 0, 0, nil, CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
 if h = INVALID_HANDLE_VALUE then
   Result := GetLastError = ERROR_FILE_EXISTS
 else
   begin
     CloseHandle(h);
     Result := True;
   end;
end;

procedure TForm1.Button1Click(Sender : TObject);
const
 c : array[Boolean] of string = ("Fuck", "OK");
begin
 ShowMessage(c[TestFileName(Edit1.Text)])
end;


 
Loginov Dmitry ©   (2005-10-18 22:18) [17]


> Ega23 ©   (18.10.05 13:48) [4]


А что я неправильно сказал?


 
LEk ©   (2005-10-18 23:24) [18]

используйте функцию MatchesMask


 
Германн ©   (2005-10-19 01:25) [19]


> Loginov Dmitry ©   (18.10.05 22:18) [17]
>
>
> > Ega23 ©   (18.10.05 13:48) [4]
>
>
> А что я неправильно сказал?


Надеюсь Олег меня простит, если я вмешаюсь. ?
Твой ответ:
> Можно например так проверить:
>
> for I := 1 to Length(Edit1.Text) do
>   if Edit1.Text[I] in ["\", "/", ":" и т.д.] then
>     Halt();
означает, что в случае, если в имени присутствуют некие допустимые, с точки зрения ОС символы, то следует прекратить выполнение, да ещё таким "варваским" способом как Halt. :)(


 
Loginov Dmitry ©   (2005-10-19 08:59) [20]


>Германн ©   (19.10.05 01:25) [19]

> ...означает, что в случае, если в имени присутствуют некие
> допустимые, с точки зрения ОС символы, то следует прекратить
> выполнение, да ещё таким "варваским" способом как Halt.
> :)(


Почему это допустимые. Как раз наоборот - программа прервется, если встретится хоть один недопустимый для имени файла символ. ИМХО, вы что-то путаете :)


 
Джо ©   (2005-10-19 14:14) [21]


>  [20] Loginov Dmitry ©   (19.10.05 08:59)

Имя файла может включать и путь.


 
Loginov Dmitry ©   (2005-10-19 16:57) [22]


> Джо ©   (19.10.05 14:14) [21]


Вы сделали для меня большое открытие. Спасибо.


 
Джо ©   (2005-10-19 17:54) [23]


>  [22] Loginov Dmitry ©   (19.10.05 16:57)
> Вы сделали для меня большое открытие. Спасибо.

Не знаю большое или нет, но ваша функция не даст пользователю ввести, например, "d:\my.txt" или "\\work\pub\1.txt".
А Halt - это вообще "беспредел".


 
Loginov Dmitry ©   (2005-10-19 18:29) [24]

Halt - это вообще для прикола. Неужели уже и приколоться нельзя. Ладно могу и серьезно:

Result := False;
S := ExtractFileName(Edit1.Text);
for I := 1 to Length(S) do
 if S[I] in ["\", "/", ":" и т.д.] then Exit;
Result := True;

 
Так бы вас устроило ?


 
Джо ©   (2005-10-19 18:47) [25]


>  [24] Loginov Dmitry ©   (19.10.05 18:29)
> Так бы вас устроило ?

Ни в коем разе. Потому что "d:\my.txt" или "\\work\pub\1.txt" и т.п.


 
Loginov Dmitry ©   (2005-10-19 23:46) [26]


> Ни в коем разе. Потому что "d:\my.txt" или "\\work\pub\1.
> txt" и т.п.


Разговор идет на разных языках?


 
Германн ©   (2005-10-20 01:26) [27]

2 Loginov Dmitry ©   (19.10.05 23:46) [26]

> Разговор идет на разных языках?
Вроде бы как и нет. На одинаковом. Но твой ответ подразумевает, что наличие в имени файла символов "\", "/", ":" и т.д. является ошибкой!? Ведь Result при этом False. :(


 
Джо ©   (2005-10-20 02:35) [28]


> [26] Loginov Dmitry ©   (19.10.05 23:46)

Объясню свою позицию.

Корректное имя файла или нет - это судить только операционной системе. Ибо само понятие "файла" и его имени - это дело файловой системы и ОС, работающей с ней. Несколько примеров, чтобы не быть голословным.
1. Символ "+" является недопустимым в имени файла на FAT в системе Windows 95 и, в то же время, допустим во многих других, в частности NTFS в Windows XP.
2. Имя файла "PRN" недопустимо во всех версиях Windows, хотя никаких "недопустимых" символов не содержит.
Поэтому считаю вообще не делом прикладной программы гадать о допустимости тех или иных символов в имени файла.
Теперь о примере [24]. Вы "вычленяете" имя файла при помощи ExtractFileName и проверяете на вхождение символы "\", "/", ":". Опять же - отчего вы так уверены, что конкретная операционная и файловая система не может позволить называть файлы вот так "readme/txt"? Вот выйдет WinFS и, кто может поручиться, что "/" не будет там допустимым символом, ну, например, указывающим на тип файла (вроде MIME-типа). И что - переписывать из-за этого программу и ругать "глючную виндовс"?

Но все это так, общие соображение. В посте [7] CaptainAlex уточнил, что имя файла, в первую очередь, должно соответствовать его собственному критерию. А именно "У меня это имя программы в скрипте". Поэтому, я считаю, и в посте [15] сказал, что нужно тогда определиться с тем, какие именно имена допустимы в его скрипте и привел пример решения. И посоветовал дальше этого не идти, то есть, позволить ФС самой принимать решения по поводу корректности. Причины такого моего совета я уже привел выше.

Вот и все, что я хотел сказать по этому поводу.


 
REA   (2005-10-20 10:45) [29]

Такое еще есть CheckNameLegalDOS8Dot3


 
Loginov Dmitry ©   (2005-10-20 12:52) [30]

Джо ©   (20.10.05 02:35) [28]

Да... Доходчиво объяснил. Спасибо :)


 
CaptainAlex   (2005-10-20 15:53) [31]

Спасибо всем.


 
Anatoly Podgoretsky ©   (2005-10-20 20:08) [32]

Джо ©   (20.10.05 02:35) [28]
А чего так далеко ходить, если уже сейчас файловая система инсталируемая и ничем не ограниченая.
Не будем ждать Висту?


 
Джо ©   (2005-10-20 20:59) [33]


>  [32] Anatoly Podgoretsky ©   (20.10.05 20:08)

Да пока ждем-с. Честно говоря, даю время на обкатку, все-таки файловая система вещь серьезная, рисковать не хочется. Еще наверняка выснятся какие-то моменты, несостыковки и тому подобное. Нам не к спеху :)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.038 c
5-1110319178
Anwy
2005-03-09 00:59
2005.11.13
Компонент StringGrid


2-1129784806
SMATMP
2005-10-20 09:06
2005.11.13
LoadFromFile


2-1129650821
Darkwing
2005-10-18 19:53
2005.11.13
Есть заполненная таблица данных, не могу создать индекс.


6-1122621029
vajo
2005-07-29 11:10
2005.11.13
Загрузка файла из Интернета, а не с прокси


2-1129572587
~SaM~
2005-10-17 22:09
2005.11.13
А в паскале есть функции аналогичные дельфовским StrToInt и т.п.?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский