![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверка корректности имени файла [D7, Win2k]
sadman © (2004-09-21 11:13:00)Подскажите пожалуйста, как программно проверить, подсунул ли пользователь программе корректное имя файла, а не 'file:name/.ext'.
Если нет в дельфи, то может в в WinAPI что-нить имеется?
sadman (2004-09-21 16:47:00) [21]Может и бред, я не спорю. Можете, канеш, и 03 позвонить.
Есть обычная задача: писать отчеты в файл. Где этот файл будет расположен -- непонятно (задается конкретным пользователем). Есть только исходная операционная система и предполагаемый пользователь. Пользователь может запускать данный модуль в любой из существующих версий виндов (в пределах допустимого пока еще есть и 95-е). Файловая система, естественно, предполагается, поддерживаемая операционной системой, в которой выполняется данный модуль (имеем FAT16, FAT32, NTFS, как минимум). При возникновении проблемы писания в лога нужно корректно указать пользователю (могущему быть древней бабушкой), что нужно сказать саппорту по телефону. А по возможности автоматически указать, что, мол, бабуля, ты скобочку на кой в имя файла запихала, а не доводить старушку до инфаркта Error-ами N xxxx .
Думаю, что на любом советском производстве с такой задачей сталкиваются. Если нет, то вам повезло. Если Вы пишете софт, каждый раз под юзера, то повезло юзеру.
Впрочем, у нас тут уже бесполезная перепалка. MS указывает, что есть General Rules и не более. В тех источниках, которые мне доступны.
KSergey (2004-09-21 16:16:00) [22]> проверяющую соответствие с General Rules
Руки отрывать за такие писательства, если заранее в общем случае нет информации по конкретному месту эксплуатации, т.е., фактически, такое поведение не описано в ТЗ.
KSergey (2004-09-21 16:15:00) [23]> Типа `авось запишеться`
Бред какой-то.
sadman (2004-09-21 16:13:00) [24]Вобщем, после недолгого рысканья по MSDN выясняется, что явно не указано функции проверки валидности. Есть только General Rules по именованию файлов. Дальнейшие поиски показали, что каждая файловая система (от MS) подразумевает чуть ли не свой формат хранения (ограничения разные). Т.е. типовых решений быть в принципе, не может. Можно конкретизировать подход, описанный KSergey в [12] и написать только very stricted функцию (забыв про комфортные длинные имена и национальные буквы), проверяющую соответствие с General Rules. Ну, и уповать на то, что заказчик не даст по репе при повисании программы на какой-нить 95-й винде =)
...теперь понятно, почему виндовс виснет и марсоход мерьканский никак поймать не могут =)) Видимо, что изначальный подход построения виндов -- неформализованные проверки. Типа `авось запишеться` =) Не иначе, как Билли -- русский =))
KSergey (2004-09-21 15:59:00) [25]> [15] TUser © (21.09.04 15:53)
Ну, напильником доработать ;) Впрочем, теперь понял о чем пожалуй речь
TUser (2004-09-21 15:53:00) [26]См. [7]
KSergey (2004-09-21 15:38:00) [27]> [13] TUser © (21.09.04 15:37)
А чем [3] плохое?? Что можно придумать принципиально лучше??
TUser (2004-09-21 15:37:00) [28]Думаю, что если поискать, то наверняка есть хорошиеготовые решения.
KSergey (2004-09-21 15:29:00) [29]> [11] sadman (21.09.04 15:18)
Не верный подход.
Хотя, тут, наверное, надо различат 2 разные задачи:
а) необходимо ввести имя файла, который когда-то потом (в несвязной явно тут операции) будет создаватся. Это одно.
б) ввести имя файла и него что-то скинуть (явно тут же, по логике задачи). Это другое.
В первом случае - ну возможно есть смысл просто проверить, чтобы не колбасили явную ерунду, а там уже по месту ориентироваться.
Во втором же случае - ну ввел пользователь имя - да и ладно! Тут же пытаться писать, если что не так - орать матом. Какой тогда смысл дополнительно проверять? ОС сделает это самостоятельно. Я уж не говорю про сложные случае, например попытка заисис на некий сервер, не допускающий русских букв или длинных имен. Ну и что тут заранее проверишь? Разве что сделать узкоспециализированную задачу, для конкретной метсности? Да, можно, иногда оправдано, но не всегда верно.
sadman (2004-09-21 15:18:00) [30]Если дискеты нет, то это другая задача, не правда ли?
Не будем переходить из плоскости проверки корректности предаваемого в функцию параметра, на плоскость экспериментального создания файла. Если моя программа будет ориентироваться на возможность создания файла в пределах своей хардварной конфигурации, то грош цена ей. Ибо на другой машине дисковода вовсе не будет. А на третьей будет. А файл, лежащий в а:\log.txt все равно будет валидный. Isn't?
КаПиБаРа (2004-09-21 13:30:00) [31]Ну будет имя файла правильное, а дискеты в дисководе нет... И какой смысл его проверять?
==========================================
Даже если вы точно знаете, что у вас мания преследования - это вовсе не значит,
что за вами никто не гонится.
==========================================
TUser (2004-09-21 13:18:00) [32]
> Странно все же, неужели WinAPI не содержит формальных средств
> проверки валидности имен и путей?
Во всяком случае VCL корректность файлов не проверяет. Напр., TFileStream ничего специально не проверяет, а просто пытается создать файл. Если не получается - пишет ошибку.
sadman (2004-09-21 12:03:00) [33]Выглядит разумно, пуркуа бы и не юз ит =)
Странно все же, неужели WinAPI не содержит формальных средств проверки валидности имен и путей?
...кстати, тут придется еще дописывать path chekin' =)
TUser (2004-09-21 12:03:00) [34][3]
Такой код пропустит, например, '.' (а такого файла не бывает), '..' (и такого тоже). Наверное, самое правильное - это [1]
Рамиль (2004-09-21 11:57:00) [35]MBo © (21.09.04 11:51) [5]
Так автор сабжа вставит его себе в программу в таком же виде, а потом скажет MBo такой код написал :)))
MBo (2004-09-21 11:51:00) [36]>Рамиль © (21.09.04 11:47) [4]
:))
Поисковик нашел. С итальянского форума
В принципе - просто демонстрирует, что нужно проверять на недопустимые символы и зарезервированные имена.
Рамиль (2004-09-21 11:47:00) [37]MBo © (21.09.04 11:42) [3]
Откуда такой код? Кошмар какой то...
MBo (2004-09-21 11:42:00) [38]http://www.codeproject.com/file/isvalidfilename.asp
или
function FileNameValidate(const AFileName: string): Boolean;
var
c: Char;
i: Integer;
begin
// Name length
if AFileName = '' then
begin
Result := False;
Exit;
end;
// Special characters
for i := 1 to Length(AFileName) do
begin
c := AFileName[i];
if (c in ['\', '/', ':', '*', '?', '"', '<', '>', '|']) then
begin
Result := False;
Exit;
end;
end;
// Reserved names
if (AFileName = 'AUX') or (AFileName = 'PRN')
or (AFileName = 'CON') then
begin
Result := False;
Exit;
end;
// Complex reserved names
if (Copy(AFileName, 1, 3) = 'COM') or (Copy(AFileName, 1, 3) = 'LPT')
then
begin
Result := False;
Exit;
end;
Result := True;
end;
sadman (2004-09-21 11:23:00) [39]Например файл aux, lpt? =)
Хотелось бы формальную проверку.
КаПиБаРа (2004-09-21 11:16:00) [40]Попробуй создать такой файл.
================================
То, что само собой разумеется,
никогда не бывает на самом деле.
================================