Валидация имени файла или каталога

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

zi000000
новенький
Сообщения: 29
Зарегистрирован: 28.04.2016 18:55:49

Валидация имени файла или каталога

Сообщение zi000000 »

Здравствуйте!
Искал в исходном коде, но не нашёл, есть ли в lazarus процедуры/функции:
1. для определения валидности имени файла или каталога?
2. для приведения строки к валидному (не содержащему запрещённых символов) виду?

Нечто похожее на это: http://docwiki.embarcadero.com/Libraries/Berlin/en/System.IOUtils.TPath

Реализовать не сложно, но если есть "из коробки", то незачем.
AVD
незнакомец
Сообщения: 5
Зарегистрирован: 10.06.2017 20:44:18

Сообщение AVD »

В модуле Masks есть ф. MatchesMask - Проверка соответствия имени файла шаблону маски.
Может подойдет?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zi000000 писал(а):не содержащему запрещённых символов


что, по вашему мнению, есть запрещенные символы? Те, которые не позволяют открыть файл/каталог?
Если речь о неправильной кодировке файлов, то это обычные процедуры смены кодировки (т. к. имя файла есть обычная строка). Если повреждена сама запись в файловой системе, то тут не факт, что стоит вообще браться -- есть шанс, что не удастся угадать формат файла и тогда все равно придется исследовать его в 16ричном виде или специальной программе. Если просто убрать эти символы, то это третий подход.
zi000000
новенький
Сообщения: 29
Зарегистрирован: 28.04.2016 18:55:49

Сообщение zi000000 »

Лекс Айрин
Например для windows, запрещёнными символами в имени файла или каталога являются: *|\:"<>?/

Вопрос задан не от незнания, как проверить наличие таких символов и привести к валидному виду (удалить/заменить их) или на этапе ввода фильтровать. Просто интересно, есть ли в лазарусе стандартные функции для этого.

п.с. Уточню. Речь идёт о создании файла или каталога с заданным пользователем именем.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zi000000, насколько я знаю... нет. Система просто не должна позволять создания таких файлов. Или переименования. И проверка валидности имени файла ложится на плечи программиста и/или соответствующего диалога.
zi000000
новенький
Сообщения: 29
Зарегистрирован: 28.04.2016 18:55:49

Сообщение zi000000 »

Лекс Айрин писал(а):проверка валидности имени файла ложится на плечи программиста

Сейчас так и есть. Спасибо.

Добавлено спустя 8 минут 19 секунд:
Я пришёл в Lazarus из Delphi.
Добавлю ссылку, пригодится кому-нибудь: http://www.webdelphi.ru/2010/06/beglyj- ... lyuchenie/
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

zi000000, да не за что.

Добавлено спустя 4 минуты 9 секунд:
Вообще, никогда не помешает делать подобные проверки, если только имя не получено из источника делающего их самостоятельно.
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

FreePascal поддерживает больше платформ, чем Delphi - реализация этой функции будет более сложная.
Запрещенные символы в имени файла даны не платформой, а типом файловой системы.
Вначале надо определить тип файловой системы: ext4, reiserfs, brtfs, ntfs и т.д., а потом возвратить результат, если есть запрещенные символы или нет.

Если вы хотите включить поддержку этой функции в FreePascal (наверно FileUtils unit), так создайте в багтрекере предложение о создании такой функции. Может кто-то реализует эту функцию или можете сразу прикрепить патч.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

кстати да, в *nix всё сложнее, может статься так что в одном каталоге одни правила, в другом другие, например корень примонтирован на ext3 с одним набором ограничений, и путь /foo/bar будет иметь одни правила проверки, а в каталог /foo/bar/banana будет примонтирован ntfs со своими ограничениями, получается что часть пути (/foo/bar) должна проверяться по одним правилам, а другая часть (banana) должна проверяться по другим правилам. И не так просто проверить какую часть пути по каким правилам проверять. Самое простое я думаю надо хранить путь целиком как есть, а проверки уже делать по необходимости например через FileExists
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

mig-31 писал(а):Запрещенные символы в имени файла даны не платформой, а типом файловой системы.
Вначале надо определить тип файловой системы: ext4, reiserfs, brtfs, ntfs и т.д., а потом возвратить результат, если есть запрещенные символы или нет.

И кто вам даст в userspace определить файловую систему? А если это шара?
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

olegy123 писал(а):И кто вам даст в userspace определить файловую систему?


Вообще, можно поступить проще... даже двумя путями, при создании файла:
1) запрещенные символы известны и их можно тупо пропускать
2) можно использовать список разрешенных символов, правда, тогда многое можно использовать только поддиапазон всех разрешенных символов. (просто тупо нереально учесть их все)

Кстати, не стоит забывать и о серых символах, типа пробела, которые хотя и допускаются, но могут здорово осложнить жизнь. А тип системы, кстати, можно и не учитывать, т. к. даже если файл создан, то он потом может перемещаться в другое место и не обязательно при этом совпадают файловые системы.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

zi000000 писал(а):для приведения строки к валидному (не содержащему запрещённых символов) виду?

Возьмите циркулярку и принудительно удалите, всё, что не буквы и не цифры. Остальные символы - по-боку, т.к. программа-то Ваша. Такое жёсткое решение - подойдёт сразу для всех систем.
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

vitaly_l, чел уже сказал, что проверку на допустимость он делает... просто хотел использовать вместо велосипеда стандартный метод.
mig-31
постоялец
Сообщения: 224
Зарегистрирован: 14.07.2011 13:46:48

Сообщение mig-31 »

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
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

А если это шара?
Ответить