![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Корректность имени файла. Как проверить? [D7]
CaptainAlex © (2005-10-18 13:07:00)Вводит нам пользователь имя файла в TEdit и говорит - а создай-ка мне такой файл. Есть ли стандартные средства для проверки его (имени) корректности.
Джо (2005-10-20 20:59:00) [1]
> [32] Anatoly Podgoretsky © (20.10.05 20:08)
Да пока ждем-с. Честно говоря, даю время на обкатку, все-таки файловая система вещь серьезная, рисковать не хочется. Еще наверняка выснятся какие-то моменты, несостыковки и тому подобное. Нам не к спеху :)
Anatoly Podgoretsky (2005-10-20 20:08:00) [2]Джо © (20.10.05 02:35) [28]
А чего так далеко ходить, если уже сейчас файловая система инсталируемая и ничем не ограниченая.
Не будем ждать Висту?
CaptainAlex (2005-10-20 15:53:00) [3]Спасибо всем.
Loginov Dmitry (2005-10-20 12:52:00) [4]Джо © (20.10.05 02:35) [28]
Да... Доходчиво объяснил. Спасибо :)
REA (2005-10-20 10:45:00) [5]Такое еще есть CheckNameLegalDOS8Dot3
Джо (2005-10-20 02:35:00) [6]
> [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] сказал, что нужно тогда определиться с тем, какие именно имена допустимы в его скриптеи привел пример решения. И посоветовал дальше этого не идти, то есть, позволить ФС самой принимать решения по поводу корректности. Причины такого моего совета я уже привел выше.
Вот и все, что я хотел сказать по этому поводу.
Германн (2005-10-20 01:26:00) [7]2 Loginov Dmitry © (19.10.05 23:46) [26]
> Разговор идет на разных языках?
Вроде бы как и нет. На одинаковом. Но твой ответ подразумевает, что наличие в имени файла символов '\', '/', ':' и т.д. является ошибкой!? Ведь Result при этом False. :(
Loginov Dmitry (2005-10-19 23:46:00) [8]
> Ни в коем разе. Потому что "d:\my.txt" или "\\work\pub\1.
> txt" и т.п.
Разговор идет на разных языках?
Джо (2005-10-19 18:47:00) [9]
> [24] Loginov Dmitry © (19.10.05 18:29)
> Так бы вас устроило ?
Ни в коем разе. Потому что "d:\my.txt" или "\\work\pub\1.txt" и т.п.
Loginov Dmitry (2005-10-19 18:29:00) [10]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 17:54:00) [11]
> [22] Loginov Dmitry © (19.10.05 16:57)
> Вы сделали для меня большое открытие. Спасибо.
Не знаю большое или нет, но ваша функция не даст пользователю ввести, например, "d:\my.txt" или "\\work\pub\1.txt".
А Halt - это вообще "беспредел".
Loginov Dmitry (2005-10-19 16:57:00) [12]
> Джо © (19.10.05 14:14) [21]
Вы сделали для меня большое открытие. Спасибо.
Джо (2005-10-19 14:14:00) [13]
> [20] Loginov Dmitry © (19.10.05 08:59)
Имя файла может включать и путь.
Loginov Dmitry (2005-10-19 08:59:00) [14]
>Германн © (19.10.05 01:25) [19]
> ...означает, что в случае, если в имени присутствуют некие
> допустимые, с точки зрения ОС символы, то следует прекратить
> выполнение, да ещё таким "варваским" способом как Halt.
> :)(
Почему это допустимые. Как раз наоборот - программа прервется, если встретится хоть один недопустимый для имени файла символ. ИМХО, вы что-то путаете :)
Германн (2005-10-19 01:25:00) [15]
> 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. :)(
LEk (2005-10-18 23:24:00) [16]используйте функцию MatchesMask
Loginov Dmitry (2005-10-18 22:18:00) [17]
> Ega23 © (18.10.05 13:48) [4]
А что я неправильно сказал?
Fay (2005-10-18 19:23:00) [18]
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;
Джо (2005-10-18 19:21:00) [19]
> [14] CaptainAlex (18.10.05 19:00)
Ты тут намешал разного-всякого.
Требование № 1: имя файла должно быть допустимое "имя программы в скрипте ".
Требование № 2: имя файла должно быть допустимым с точки зрения файловой системы.
Решение.
Определить допустимые символы в названии "программы в скрипте". Для простоты положим, что это любые символы латинского алфавита. Тогда для каждого Ch должно быть справедливо:UpperCase(Ch) in ['A'..'Z'];Первый вопрос решили.
Решение требования номер 2 сводится к тому, чтобы вызвать функцию сохранения (в том или ином виде) и проанализировать код возврата. И вывести соответствующее предупреждение в случае неуспешного завершения операции.
CaptainAlex (2005-10-18 19:00:00) [20]Ну да, да :) Я знаю. Я все знаю. И про множества и про переменную. Я подход иллюстрирую. Это черновой код, к тому же отвратительно написанный.
Я спрашивал про альтернативу такому подходу :)