![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка корректности имени файла [D7, Win2k]
sadman © (2004-09-21 11:13:00)Подскажите пожалуйста, как программно проверить, подсунул ли пользователь программе корректное имя файла, а не 'file:name/.ext'.
Если нет в дельфи, то может в в WinAPI что-нить имеется?
Defunct (2004-09-24 01:47:00) [1]Anatoly Podgoretsky © (23.09.04 09:06) [35]
>А какая разница, какая скорость, все равно к времени проверки добавится время реального обращения, отсюда первая операция излишняя, ничего не дающая.
ХМ? Я разве предлагал проверять создание? Я предлагал создавать, и сразу с ним и работать, а не получилось создать - тогда вывести ошибку.
Я смотрю тут речь о сетевом доступе оказывается.
сервер должен проверять корректность имени, а не клиент, так как предусмотреть все стандарты невозможно, к тому же может быть просто такая обычная ситуация как нет доступа к ресурсу, прав не хватает, и что? спрашивается нафих проверяли корректность имени? Клиент может отбраковывать только грубые ошибки: звездочки, знаки вопроса в имени, а все остальное - работа сервера.
GuAV (2004-09-24 01:39:00) [2]
> Такой код пропустит, например, '.' (а такого файла не бывает),
> '..' (и такого тоже).
А имя '...' является ?
Defunct (2004-09-24 01:28:00) [3]sadman (23.09.04 15:30) [36]
> Defunct, а кто сказал, что я буду писать на супербыстрый накопитель, на не на удаленный ftp, через модем на 2400? =)
Ваш вопрос сказал.
Ибо на ftp совсем не такая форма записи, и некоторые ftp серверы не поддерживают русские символы в именах.
wicked (2004-09-23 15:42:00) [4]хмм.... а если пробовать создать указанный файл в TEMP папке?...
или использовать регекспы для проверки правильности имени файла?... что то вродеExecRegExpr('^([^\\\/\|\:\*\"\<\>\?])+$', FileName)....
и кстати, ":" является допустимым символом для имени файла - см. упоминания про NTFS stream на http://www.sysinternals.com
sadman (2004-09-23 15:30:00) [5]Defunct, а кто сказал, что я буду писать на супербыстрый накопитель, на не на удаленный ftp, через модем на 2400? =)
Вообще, конечно, забавно, что предполагается такой же умный пользователь, как программист, пишущий модуль =) У меня вон знакомый минут пять в ip-адресе запятую вместо точки поставил и искал баг.
Anatoly Podgoretsky (2004-09-23 09:06:00) [6]Defunct © (23.09.04 02:49) [33]
А какая разница, какая скорость, все равно к времени проверки добавится время реального обращения, отсюда первая операция излишняя, ничего не дающая.
Fay © (23.09.04 03:03) [34]
У меня скорость обращения порядка 55 мб/сек, могу повысить до 110, надо только второй винчестер поставить.
Кроме того откуда копировать, с этого винчестера, с другого винчестера, с тем же контроллером или с отдельным контроллером, с сети? В любом случае время копирования это две операции чтение и запись.
Fay (2004-09-23 03:03:00) [7]2Defunct © (23.09.04 02:49) [33]
>> скорость современных дисковых накопителей ~100MB/s
Это скорость чего?! Обмена с буфером? Попробуйте скопировать файл со скоростью 50Mb/s.
Defunct (2004-09-23 02:49:00) [8]sadman (22.09.04 10:10) [31]
PS: может у вас компьютер ZX Spectrum? что вы так переживаете за 3 сек? Современные машины выполняют 10^9 операций в секунду, скорость современных дисковых накопителей ~100MB/s, а вы тут рассказываете о каких-то обломах с созданием файла. Это все равно что переживать, не упадет ли Останкино под тяжестью гульки.
Defunct (2004-09-23 02:39:00) [9]sadman (22.09.04 10:10) [31]
Полнейшая чипуха. Создали файл - хорошо работаем сразу с ним. Не создали - "облом" отправляем обратным письмом. А в вашем случае дополнительно теряется время на проверку строки, итого время на проверку, потом время на создание - и приехали ваш долгожданный таймаут.
sadman (2004-09-22 10:10:00) [10]Вероятность облома остается одинакова. Время, затраченное, на получение облома -- разнится в каждом случае =)
3 попытки * 3 секунды = 9 секунд до облома
<1 сек (3 проверки) + 3 секунды на проверку = ~3 секунды до облома
Пример условный, единицы времени выдуманы (не учитываются вероятности перегруза канала связи, таймауты на линиях и пр.), но задача вполне вероятна.
Впрочем, это уже теория пошла.
Anatoly Podgoretsky (2004-09-22 09:59:00) [11]Желание понятно, но смысла нет.
Ну проверил ты, твоя функция подтвердила, а при реальном использовании получишь облом.
sadman (2004-09-22 09:39:00) [12]Defunct, мерси =)
Задача-то встречается и в других местах. Например там, где время на открывание файла с целью проверки валидности имени превышают... ну хотя бы секунды 3 (какое-нить защищенное соединение с авторизацией). Так что тут конкретное совершенно желание: проверить корректность имени, не прибегая к экспериментальным открытиям/созданиям файла.
Если данной функции нет, то нет. Большего я не хочу =)
Defunct (2004-09-21 19:22:00) [13]Sandman25 © (21.09.04 17:12) [23]
Это не будет работать.
LDS/LES не обслуживаются в Protected mode.
К тому же вопрос не о DOS names
Defunct (2004-09-21 19:17:00) [14]sadman (21.09.04 16:47) [20]
Храним отчет всегда в файле, к примеру, с именем report.txt, а пользователю даем возможность создать на него ярлык. Какие тут проблемы? В ТЗ описываете файл-отчет хранится там-то и там-то, ярлык создается так-то и так-то.
Пользователям конечного продукта должно быть все топорно документировано, а не так, что Вася поместил отчет хз где, а вам потом звонят и жалуются, что программа не ведет отчет.
sadman (2004-09-21 18:15:00) [15]Юрий Зотов © (21.09.04 17:48) [25]
if (MatchesMask('file:name', '*')) then Edit1.Text:='yep' else Edit1.Text:='nope';
Увы.
Юрий Зотов (2004-09-21 17:48:00) [16]А просто MatchesMask с шаблоном "любой файл"?
Anatoly Podgoretsky (2004-09-21 17:16:00) [17]Amoeba © (21.09.04 17:06) [22]
Не рабочая
Sandman25 © (21.09.04 17:12) [23]
Не рабочая
Sandman25 (2004-09-21 17:12:00) [18]По наводке [22] Amoeba © (21.09.04 17:06)
function ValidFileName(const FileName: string): Boolean;
const
MaxNameLen = 12; { file name and extension }
MaxExtLen = 4; { extension with point }
MaxPathLen = 79; { full file path in DOS }
var
Dir, Name, Ext: TFileName;
function HasAny(Str, SubStr: string): Boolean; near; assembler;
asm
PUSH DS
CLD
LDS SI,Str
LES DI,SubStr
INC DI
MOV DX,DI
XOR AH,AH
LODSB
MOV BX,AX
OR BX,BX
JZ @@2
MOV AL,ES:[DI-1]
XCHG AX,CX
@@1: PUSH CX
MOV DI,DX
LODSB
REPNE SCASB
POP CX
JE @@3
DEC BX
JNZ @@1
@@2: XOR AL,AL
JMP @@4
@@3: MOV AL,1
@@4: POP DS
end;
begin
Result := True;
Dir := Copy(ExtractFilePath(FileName), 1, MaxPathLen);
Name := Copy(ExtractFileName(FileName), 1, MaxNameLen);
Ext := Copy(ExtractFileExt(FileName), 1, MaxExtLen);
if (Dir + Name <> FileName) or HasAny(Name, ';,=+<>|"[] \') or
HasAny(Copy(Ext, 2, 255), ';,=+<>|"[] \.') then Result := False;
end;
Amoeba (2004-09-21 17:06:00) [19]Если ничего не путаю, то кажись в RxLib была какая-то функция для проверки имен файлов на наличие недопустимых символов. Под рукой бибилиотеки сейчас нет, так что за точность информации не ручаюсь.
Anatoly Podgoretsky (2004-09-21 16:56:00) [20]sadman (21.09.04 11:23) [2]
Нет смысла, надо просто писать и обрабатывать ошибку.