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

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

Проверка корректности имени файла [D7, Win2k]


Страницы:   1 2

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]
Нет смысла, надо просто писать и обрабатывать ошибку.


Страницы:   1 2

Наверх

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