Форум: "Основная";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];
ВнизКорректность имени файла. Как проверить? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.038 c