Валидация имени файла или каталога
Модератор: Модераторы
Валидация имени файла или каталога
Здравствуйте!
Искал в исходном коде, но не нашёл, есть ли в lazarus процедуры/функции:
1. для определения валидности имени файла или каталога?
2. для приведения строки к валидному (не содержащему запрещённых символов) виду?
Нечто похожее на это: http://docwiki.embarcadero.com/Libraries/Berlin/en/System.IOUtils.TPath
Реализовать не сложно, но если есть "из коробки", то незачем.
Искал в исходном коде, но не нашёл, есть ли в lazarus процедуры/функции:
1. для определения валидности имени файла или каталога?
2. для приведения строки к валидному (не содержащему запрещённых символов) виду?
Нечто похожее на это: http://docwiki.embarcadero.com/Libraries/Berlin/en/System.IOUtils.TPath
Реализовать не сложно, но если есть "из коробки", то незачем.
В модуле Masks есть ф. MatchesMask - Проверка соответствия имени файла шаблону маски.
Может подойдет?
Может подойдет?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zi000000 писал(а):не содержащему запрещённых символов
что, по вашему мнению, есть запрещенные символы? Те, которые не позволяют открыть файл/каталог?
Если речь о неправильной кодировке файлов, то это обычные процедуры смены кодировки (т. к. имя файла есть обычная строка). Если повреждена сама запись в файловой системе, то тут не факт, что стоит вообще браться -- есть шанс, что не удастся угадать формат файла и тогда все равно придется исследовать его в 16ричном виде или специальной программе. Если просто убрать эти символы, то это третий подход.
Лекс Айрин
Например для windows, запрещёнными символами в имени файла или каталога являются: *|\:"<>?/
Вопрос задан не от незнания, как проверить наличие таких символов и привести к валидному виду (удалить/заменить их) или на этапе ввода фильтровать. Просто интересно, есть ли в лазарусе стандартные функции для этого.
п.с. Уточню. Речь идёт о создании файла или каталога с заданным пользователем именем.
Например для windows, запрещёнными символами в имени файла или каталога являются: *|\:"<>?/
Вопрос задан не от незнания, как проверить наличие таких символов и привести к валидному виду (удалить/заменить их) или на этапе ввода фильтровать. Просто интересно, есть ли в лазарусе стандартные функции для этого.
п.с. Уточню. Речь идёт о создании файла или каталога с заданным пользователем именем.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zi000000, насколько я знаю... нет. Система просто не должна позволять создания таких файлов. Или переименования. И проверка валидности имени файла ложится на плечи программиста и/или соответствующего диалога.
Лекс Айрин писал(а):проверка валидности имени файла ложится на плечи программиста
Сейчас так и есть. Спасибо.
Добавлено спустя 8 минут 19 секунд:
Я пришёл в Lazarus из Delphi.
Добавлю ссылку, пригодится кому-нибудь: http://www.webdelphi.ru/2010/06/beglyj- ... lyuchenie/
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
zi000000, да не за что.
Добавлено спустя 4 минуты 9 секунд:
Вообще, никогда не помешает делать подобные проверки, если только имя не получено из источника делающего их самостоятельно.
Добавлено спустя 4 минуты 9 секунд:
Вообще, никогда не помешает делать подобные проверки, если только имя не получено из источника делающего их самостоятельно.
FreePascal поддерживает больше платформ, чем Delphi - реализация этой функции будет более сложная.
Запрещенные символы в имени файла даны не платформой, а типом файловой системы.
Вначале надо определить тип файловой системы: ext4, reiserfs, brtfs, ntfs и т.д., а потом возвратить результат, если есть запрещенные символы или нет.
Если вы хотите включить поддержку этой функции в FreePascal (наверно FileUtils unit), так создайте в багтрекере предложение о создании такой функции. Может кто-то реализует эту функцию или можете сразу прикрепить патч.
Запрещенные символы в имени файла даны не платформой, а типом файловой системы.
Вначале надо определить тип файловой системы: ext4, reiserfs, brtfs, ntfs и т.д., а потом возвратить результат, если есть запрещенные символы или нет.
Если вы хотите включить поддержку этой функции в FreePascal (наверно FileUtils unit), так создайте в багтрекере предложение о создании такой функции. Может кто-то реализует эту функцию или можете сразу прикрепить патч.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
кстати да, в *nix всё сложнее, может статься так что в одном каталоге одни правила, в другом другие, например корень примонтирован на ext3 с одним набором ограничений, и путь /foo/bar будет иметь одни правила проверки, а в каталог /foo/bar/banana будет примонтирован ntfs со своими ограничениями, получается что часть пути (/foo/bar) должна проверяться по одним правилам, а другая часть (banana) должна проверяться по другим правилам. И не так просто проверить какую часть пути по каким правилам проверять. Самое простое я думаю надо хранить путь целиком как есть, а проверки уже делать по необходимости например через FileExists
mig-31 писал(а):Запрещенные символы в имени файла даны не платформой, а типом файловой системы.
Вначале надо определить тип файловой системы: ext4, reiserfs, brtfs, ntfs и т.д., а потом возвратить результат, если есть запрещенные символы или нет.
И кто вам даст в userspace определить файловую систему? А если это шара?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
olegy123 писал(а):И кто вам даст в userspace определить файловую систему?
Вообще, можно поступить проще... даже двумя путями, при создании файла:
1) запрещенные символы известны и их можно тупо пропускать
2) можно использовать список разрешенных символов, правда, тогда многое можно использовать только поддиапазон всех разрешенных символов. (просто тупо нереально учесть их все)
Кстати, не стоит забывать и о серых символах, типа пробела, которые хотя и допускаются, но могут здорово осложнить жизнь. А тип системы, кстати, можно и не учитывать, т. к. даже если файл создан, то он потом может перемещаться в другое место и не обязательно при этом совпадают файловые системы.
zi000000 писал(а):для приведения строки к валидному (не содержащему запрещённых символов) виду?
Возьмите циркулярку и принудительно удалите, всё, что не буквы и не цифры. Остальные символы - по-боку, т.к. программа-то Ваша. Такое жёсткое решение - подойдёт сразу для всех систем.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
vitaly_l, чел уже сказал, что проверку на допустимость он делает... просто хотел использовать вместо велосипеда стандартный метод.
olegy123 писал(а):И кто вам даст в userspace определить файловую систему? А если это шара?
CentOS7
Код: Выделить всё
-bash-4.2$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda3 ext4 50264616 10077632 37610600 22% /
devtmpfs devtmpfs 1905588 0 1905588 0% /dev
tmpfs tmpfs 1920208 88 1920120 1% /dev/shm
tmpfs tmpfs 1920208 9144 1911064 1% /run
tmpfs tmpfs 1920208 0 1920208 0% /sys/fs/cgroup
tmpfs tmpfs 1920208 16 1920192 1% /tmp
/dev/sda2 ext4 423199192 19410748 382268060 5% /home
tmpfs tmpfs 384044 16 384028 1% /run/user/42
tmpfs tmpfs 384044 0 384044 0% /run/user/1000
А если это шара?
