BOOST C++ Filesystem library: руководство по портабельности файловых путей

Вступление

Функции проверки путей

Рекомендации по именам файлов и каталогов

Вступление

Как и для любой программы на C++, выполняющей операции ввода/вывода, нет гарантий, что код, использующий библиотеку Boost.Filesystem, будет переносим между разными операционными системами. Критические аспекты I/O, такие как интерпретация путей операционной системой, не определяются стандартами языков C и C++.

Невозможно узнать, будет ли имя файла или каталога корректным (и потому портабельным) для неизвестной ОС. Всегда есть вероятность, что ОС может использовать необычные имена (к примеру, числа меньше 4096), или очень ограниченные по размеру (максимум 6 символов в имени, к примеру для PDP-11). Другими словами, портабельность не бывает абсолютной; она всегда относится к определенному числу конкретных ОС и файловых систем.

Есть возможность узнать заранее, будет ли имя файла или каталога корректным для заданной ОС. Также можно сконструировать имена, которые вероятно будут портабельными для большого числа современных и специализированных (legacy) ОС.

Почти все современные ОС поддерживают множество файловых систем. По минимуму они поддерживают некую родную файловую систему плюс файловую систему CD-ROM (обычно ISO-9669, часто с расширениями Juliet).

Каждая файловая система может иметь свои правила построения имен. К примеру, современные версии Windows поддерживают файловые системы NTFS, FAT, FAT32, и ISO-9660, и правила построения имен для некоторых из этих файловых систем серьезно зарличаются. Каждая файловая система может иметь отличающиеся правила для общей корректности путей, такие как максимальная длина или число подкаталогов.

В результате в библиотеке Boost.Filesystem механизм проверки имен name_check не может гарантировать портабельность имен каталогов и файлов. Скорее он дает программисту возможность достичь портабельности за счет обнаружения общих проблем с именами.

Функции проверки путей

Функция name_check возвращает true, если ее аргумент является корректным именем файла или каталога для конкретной ОС или файловой системы. Реализован целый набор таких функций, и допускается использовать пользовательскую функцию проверки.

Функция portable_name представляет особый интерес, так как она является начальной функцией проверки имени по умолчанию и тщательно выбирается для обеспечения широкой портабельности без излишнего ограничения на выразительность.

Функия native представляет интерес по причине того, что она часто используется когда пути поступают от пользователя компьютера или других источников, который форматируют путь по правилам конкретной ОС.

Поставляемые с библиотекой Boost.Filesystem функции name_check
Название Описание
portable_posix_name Возвращает true для имен, состоящих только из символов, указанных правилом Набор символов портабельной системы , определенной стандартом POSIX (www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap03.html).
Допускаются только символы 0-9, a-z, A-Z, '.', '_', и '-'.

Использование: приложения, которые должны быть совместимы с любой POSIX-системой.

windows_name Возвращает true для имен, состоящих только из символов, определенных в Windows platform SDK как допустимые, независимо от файловой системы. Допустимы любые символы за исключением 0x0-0x1F, '<', '>', ':', '"', '/', '\', и '|'. Кроме того, имена не должны оканчиваться пробелом или точкой.

Использование: приложения, которые должны быть совместимы с Windows.

Замечание: Зарезервированные имена устройств нельзя использовать в качестве имен файлов, но они не обнаруживаются данной функцией, так как они являются корректными путями. Речь идет об именах CON, PRN, AUX, CLOCK$, NUL, COM[1-9], LPT[1-9], с возможным расширением имени файла (к примеру, NUL.tx7).

portable_name windows_name(name) && portable_posix_name(name), и первый символ не точка и не тире (hyphen).

Замечение: это начальная функция по умолчанию для name_check.

Использование: приложения, которые должны быть портабельными на большом множестве современных ОС, больших и малых, и некоторых унаследованных (legacy) ОС.

portable_directory_name portable_name(name), точек нет.

Использование: приложения, которые должны быть портабельными для большого множества платформ, включая OpenVMS.

portable_file_name portable_name(name), исключая то, что допускается только 1 точка, и только если за ней следует от 1 до 3 символов.

Использование: приложения, которые должны быть портабельными для большого множества платформ, включая OpenVMS и другие системы, для которых существует концепция "расширения имени файла", но с ограничением на длину.

no_check Возвращает всегда true...

Использование: Когда желательна обобщенная грамматика, но нежелательна проверка имен. К примеру, программа, которая передает имена, созданные зде-то в другом месте, не имеет выбора, кроме как принимать эти имена. Другой пример это приложение, которое предпочинает использовать библиотеку Boost.Filesystem и ее обобщенную грамматику, но не заинтересованная в портабельности. Альтернативой функции no_check может быть native, но native имеет побочный эффект в виде изменения принятой грамматики (см. пояснения далее).

native Определяемая реализацией функция проверки имен. Гарантированно возвращает true для любых имен, которые признаются корректными для конкретной ОС.

Побочный эффект: Синтаксис для аргумента src конструктора класса path зависит от реализации согласно синтаксическим правилам построения путей для ОС.

Использование: В конструкторах класса path, когда источником путей является либо пользовательский ввод, либо иной источник, обеспечивающий формат путей по правилам ОС. Обратите внимание, что default_name_check( native ) приводит к тому, что все строковые аргументы src в конструкторе класса path начинают рассматривать как следующие синтаксическим правилам используемой ОС, что иногда может быть нежелательным.

Замечение: Может вернуть true для некоторых имен, которые не рассматриваются как корректные операционной системой во всех случаях (в частности, на ОС , которые поддерживают множество файловых систем)..

Рекомендации по именами файлов и каталогов

Рекомендация Объяснение
Используйте в именах файлов и каталогов только символы  A-Z, a-z, 0-9, точка, тире, и подчеркивание.

Используйте любую из "портабельных" функций проверки имен чтобы гарантировать соблюдение рекомендации.

Это символы, определенные стандартом POSIX для портабельных имен каталогов и файлов, и они также корректны для Windows, Mac, и многих других современных ОС и файловых систем.
Не используйте точку или тире в качестве первого символа имени. Не используйте точку как последний символ в имени.

Используйте функции portable_name, portable_directory_name, или portable_file_name для проверки соблюдения этой рекомендации.

Некоторые ОС трактуют первый символ в имени особым образом. Например POSIX. Windows не разрешает использовать точку в качестве первого символа.
Не используйте точки в именах каталогов.

Используйте функцию portable_directory_name для проверки соблюдения этой рекомендации.

Требование ISO-9660 без расширения Juliet, родной файловой системы OpenVMS, и других унаследованных ОС.
Не используйте более одной точки в имени файла, и ограничьте число символов после точки до трех.

Используйте функцию portable_file_name для проверки соблюдения этой рекомендации.

Требование ISO-9660 level 1, родной файловой системы OpenVMS, и других унаследованных ОС
Не предполагайте, что имена чувствительны к регистру. К примеру, не ожидайте, что каталог сможет хранить отдельные элементы с именами "Foo" и "foo". Некоторые файловые системы не чувствительны к регистру букв в именах. К примеру, Windows NTFS сохраняет регистр букв в именах файлов, но игнорирует регистр при поиске файлов (если не работает под POSIX системой, тогда она чувствительна к регистру).
Не предполагайте, что имена не чувствительны к регистру. К примеру, не ожидайте, что созданный с именем "Foo" файл можно будет открыть с именем "foo". Некоторые файловые системы чувствительны к регистру букв.
Не используйте тире в именах. ISO-9660 level 1, и возможно некоторые унаследованные системы, не допускают использования тире.
Ограничьте длину строки, возвращаемую методом path::string(), до 255 символов. Обратите внимание, что ISO 9660 явно ограничивает число вложенных подкаталогов числом 8, хотя это ограничение устранено для расширения Juliet. Некоторые ОС задают пределы на максимальную длину пути. К примеру, Windows 2000 ограничивает пути 260 символами.
Ограничьте длину каждого одиночного имени в пути. Выберите соответствующий предел согласно ОС и файловой системе, совместимость с которыми вам важна:
   Ограничений нет::  POSIX, Windows, MAC OS X.
   31 символ: Classic Mac OS
   8 символов + точка + 3 символа: ISO 9660 level 1
   32 символа: ISO 9660 level 2 и 3
   128 символов (64 если юникод): ISO 9660 с расширением Juliet
Ограничение длины имен может заметно уменьшить расходы на оперирование путями. Кроме того, слишком большие величины максимального размера длины имен могут нарушить портабельность.

© Copyright Beman Dawes, 2002, 2003

Use, modification, and distribution are subject to the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at www.boost.org/LICENSE_1_0.txtt)

последняя правка: 31.05.2005

библиотека BOOST C++ http://www.boost.org
перевод Elijah Koziev www.solarix.ru

  © Mental Computing 2010