Проверьте, является ли строка допустимым именем файла с QT

Есть ли путь с Qt 4.6 проверять если данный QString допустимое имя файла (или имя каталога) в текущей операционной системе? Я хочу проверить на имя, чтобы быть допустимым, не, чтобы файл существовал.

Примеры:

// Some valid names
test
under_score
.dotted-name

// Some specific names
colon:name // valid under UNIX OSes, but not on Windows
what? // valid under UNIX OSes, but still not on Windows

Как я достиг бы этого? Есть ли некоторые Qt встроенная функция?

Я хотел бы постараться не создавать пустой файл, но если бы нет никакого другого надежного пути, я все еще хотел бы видеть, как сделать это "чистым" способом.

Большое спасибо.

19
задан ereOn 14 June 2010 в 15:11
поделиться

4 ответа

Я не думаю, что Qt имеет встроенную функцию, но если Boost является опцией, вы можете использовать функции name_check Boost.Filesystem .

Если Boost не вариант, его страница, посвященная функциям name_check, по-прежнему является хорошим обзором того, что нужно проверять на различных платформах.

3
ответ дан 30 November 2019 в 04:11
поделиться

Трудно надежно сделать в Windows (некоторые странные вещи, такие как файл с именем "com" по-прежнему недействительны) и хотите ли вы обрабатывать Unicode, или уловки подстановки, чтобы разрешить имя файла> 260 символов .

Здесь уже есть хороший ответ Как мне проверить, является ли данная строка допустимым / допустимым именем файла в Windows?

1
ответ дан 30 November 2019 в 04:11
поделиться

Я бы просто создал простую функцию для проверки имени файла для платформы, которая просто ищет в строке любые недопустимые символы. Не думайте, что в Qt есть встроенная функция. Вы можете использовать #ifdefs внутри функции, чтобы определить, на какой платформе вы находитесь. Я бы сказал, достаточно чисто.

0
ответ дан 30 November 2019 в 04:11
поделиться

Это ответ, который я получил от Силье Йохансен - инженера службы поддержки - Trolltech ASA (хотя в марте 2008 г.)

Однако. сложность включения настроек локали и поиска унифицированный способ запроса файловых систем в Linux / Unix об их функциональность близка к невозможной.

Однако, насколько мне известно, все известные мне приложения игнорируют это проблема.

(читайте: они не собираются его реализовывать)

Boost тоже не решает проблему, они дают лишь некоторое расплывчатое представление о максимальной длине путей, особенно если вы хотите быть кроссплатформенным. Насколько мне известно, многие пытались решить эту проблему, но безуспешно (по крайней мере, теоретически, на практике определенно можно написать программу, которая создает допустимые имена файлов в большинстве случаев .

Если вы Если вы хотите реализовать это самостоятельно, возможно, стоит учесть несколько не сразу очевидных вещей, таких как:

Осложнения с недопустимыми символами

Разница между ограничениями файловой системы и ограничениями ОС и программного обеспечения. Проводник Windows, который я считаю частью ОС Windows, например, не полностью поддерживает NTFS. Файлы, содержащие ':' и '?' и т. д., могут благополучно находиться в разделе ntfs, но проводник просто подавляется ими. Кроме того, вы можете играть осторожно и использовать рекомендации из Boost Filesystem .

Сложности с длиной пути

Вторая проблема, которая не решена полностью с помощью страницы повышения, - это длина полного пути. Вероятно, единственное, что на данный момент известно наверняка, это что никакая комбинация ОС / файловой системы не поддерживает в определенные длины пути. Однако такие утверждения, как «максимальное количество путей Windows ограничено 260 символами» неверны. API-интерфейс Unicode из Windows позволяет создавать пути длиной до 32 767 символов utf-16.Я не проверял, но я представляю, как Explorer задыхается в равной степени, что сделало бы эту функцию совершенно бесполезной для программного обеспечения, у которого есть другие пользователи, кроме вас (с другой стороны, вы могли бы предпочесть, чтобы ваше программное обеспечение не давилось хором).

Существует старая переменная с именем PATH_MAX, что звучит многообещающе, но проблема в том, что PATH_MAX просто не .

Чтобы закончить конструктивным замечанием, вот несколько идей о возможных способах кодирования решения.

  1. Используйте определения для создания разделов, специфичных для ОС. ( Qt может помочь вам с этим )
  2. Воспользуйтесь советом, данным на странице повышения и документации по ОС и файловой системе, чтобы выбрать недопустимые символы.
  3. Длина пути - единственная работоспособная идея, которая возникает у меня mind - это метод двоичного дерева методом проб и ошибок, использующий обработку ошибок системного вызова для проверки допустимой длины пути. Это довольно странно, но это может быть единственная возможность получить точные результаты в различных системах.
  4. Научитесь элегантной обработке ошибок.

Надеюсь, это дало некоторые идеи.

22
ответ дан 30 November 2019 в 04:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: