Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.025 c
2-1129795481
koks
2005-10-20 12:04
2005.11.13
Форматирование вычисляемого поля


14-1129788075
dreamse
2005-10-20 10:01
2005.11.13
Проблема с доступом к сайту !


1-1130138943
td
2005-10-24 11:29
2005.11.13
только цифры в поле


2-1130268831
dibosh
2005-10-25 23:33
2005.11.13
бот


14-1129748306
Bogdan1024
2005-10-19 22:58
2005.11.13
как программирование на вас влияет?