Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Корректность имени файла. Как проверить? [D7]


Страницы:   1 2

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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо