路徑名可移植性指南

簡介
name_check 函數
文件名和目錄名建議

簡介

和其它執行I/O操作的C++程序相似,並不保證使用 Boost.Filesystem 的程序一定可以在不同操作系統間移植。I/O的關鍵方面,如操作系統如何解釋路徑,並沒有在C和C++標準中規定。

對於一個未知的操作系統,不可能知道一個文件或目錄名是否有效(從而是可移植的)。總是有可能一個操作系統使用了不常見的名字(例如數量小於4096)或者非常有限的大小(例如最大六個字符的名字)。換言之,可移植性不是絕對的;它總是與特定的操作系統或文件系統相關。

對於某個特定的操作系統,有可能提前知道一個目錄名或文件名是否很可能有效。也有可能構造一個很可能可以移植到多數現代和舊用操作系統的名字。

幾乎所有現代操作系統都支持多種文件系統。至少,它們支持一個原生文件系統以及一個CD-ROM文件系統(通用的 ISO-9669, 常常會帶有 Juliet 擴展)。

每個文件系統可能有它自己的命名規則。例如,現代版本的 Windows 支持 NTFS, FAT, FAT32, 和 ISO-9660 文件系統,與其它相比,這些文件系統中有些命名規則會與眾不同。每個文件系統對於路徑有效性可以有不同的規則,如最大長度或子目錄數量。

結果,Boost.Filesystem 的 name_check 函數不能保證目錄名和文件名的可移植性。應該說,它們通過提前檢查常見的命名問題,給了程序員一個"努力的機會"來達成可移植性。

name_check 函數

name_check 函數返回 true,如果它的參數對於某個特定操作系統或文件系統是有效的名字。有多個這樣的函數,而且用戶也可以提供自己的 name_check.

函數 portable_name 特別應該注意,因為它被小心地設計為提供廣泛的可移植性而不會過度限製表示形式。

本庫提供的 name_check 函數
名字 說明
portable_posix_name 對於只含有在 POSIX 中定義的 Portable Filename Character Set 規則中指定的字符的名字,返回 true (www.opengroup.org/onlinepubs/007904975/basedefs/xbd_chap03.html).
只允許字符 0-9, a-z, A-Z, '.', '_', 和 '-'.

用於: 必須可以移植到任何 POSIX 系統上的應用程序。

windows_name 對於只含有由 Windows 平台 SDK 認為有效的字符的,返回 true,不管何種文件系統。允許除了 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), 且第一個字符不是句點或連字符。

用於: 必須移植到多個現代操作系統,大的和小的,以及一些舊有O/S的應用程序。

portable_directory_name portable_name(name), 且沒有句點。

用於: 必須移植到多個平台,包括 OpenVMS 的應用程序。

portable_file_name portable_name(name), 除了允許單個句點並後跟1-3個字符。

用於: 必須移植到多個平台,包括 OpenVMS 和其它具有"文件擴展名"概念但長度有限的系統的應用程序。

native 實現定義的 name_check. 對於操作系統視為有效的所有名字,返回 true.

注: 可能會對於在所有情形下都被操作系統視為無效的名字返回 true (特別是在那些支持多種文件系統的操作系統上)。

文件名和目錄名建議

建議 原理
限定文件名和目錄名只使用 A-Z, a-z, 0-9, 句點, 連字符, 和下劃線。

使用任一 "portable_" name check functions 來強制這一建議。

這些是由POSIX標準為可移植目錄名和文件名所指定的字符,並且在 Windows, Mac, 以及多數現代文件系統中均有效。
不要使用句點或連字符作為名字的第一個字符。不要用句點作為名字的最後一個字符。

使用 portable_name, portable_directory_name, 或 portable_file_name 來強制這一建議。

有些操作系統對於名字的第一個字符有特殊規則。例如 POSIX。Windows 則不允許句點作為最後一個字符。
不要在目錄名中使用句點。

使用 portable_directory_name 來強制這一建議。

這是不帶 Juliet 擴展的 ISO-9660, OpenVMS 文件系統以及其它一些舊系統的要求。
不要在一個文件名中使用超過一個句點,並限制句點後的部分為三個字符以內。

使用 portable_file_name 來強制這一建議。

這是 ISO-9660 level 1, OpenVMS 文件系統以及其它舊系統的要求。
不要假定名字是大小寫敏感的。例如,不要期望一個目錄可以分辨 "Foo" 和 "foo" 為不同項。 有些文件系統是大小寫敏感的。例如 Windows NTFS 對於它保存的名字保留大小寫,但是在查找名字時則是大小寫不敏感的(除非運行在 POSIX 子系統上,這時執行大小寫敏感的查找)。
不要假定名字是大小寫不敏感的。例如,不要期望一個以名字 "Foo" 創建的文件可以以名字 "foo" 打開。 有些文件系統是大小寫敏感的。例如 POSIX.
不要在名字中使用連字符。 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 and 3
   128個字符(Unicode則為64): ISO 9660 帶 Juliet 擴展
限制名字長度會顯著降低文件名的表現力,但對於長度使用較大限制值則會影響可移植能力。

Revised 03 June, 2007

c 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.txt)