命名檔案、路徑和命名空間

Windows 支援的所有檔案系統都使用檔案和目錄的概念來存取儲存在磁片或裝置上的資料。 使用適用于檔案和裝置 I/O 之 Windows API 的 Windows 開發人員應該瞭解檔案和目錄名稱的各種規則、慣例和限制。

您可以使用檔案 I/O API,從磁片、裝置和網路共用存取資料。 檔案和目錄以及命名空間是路徑概念的一部分,這是從磁片或裝置或特定作業的網路連線取得資料的字串標記法。

某些檔案系統,例如 NTFS,支援連結的檔案和目錄,也會遵循檔案命名慣例和規則,就像一般檔案或目錄一樣。 如需詳細資訊,請參閱硬式連結和連接點和重新剖析點和檔案作業

如需詳細資訊,請參閱下列小節:

若要瞭解如何設定Windows 10以支援長檔案路徑,請參閱路徑長度上限限制

檔案和目錄名稱

所有檔案系統都會遵循個別檔案的相同一般命名慣例:基底檔案名和選擇性副檔名,並以句號分隔。 不過,每個檔案系統,例如 NTFS、CDFS、exFAT、UDFS、FAT 和 FAT32,對於目錄或檔案路徑中個別元件的組成方式,可以有特定且不同的規則。 請注意, 目錄 只是將目錄指定為目錄之特殊屬性的檔案,否則必須遵循與一般檔案相同的所有命名規則。 因為 目錄 一詞只是參考檔案系統所考慮的特殊檔案類型,所以某些參考資料會使用一般詞彙 檔案 來包含目錄和資料檔案的概念,例如。 因此,除非另有指定,否則檔案的任何命名或使用規則或範例也應該套用至目錄。 「 路徑 」一詞是指一或多個目錄、反斜線,以及磁片區名稱。 如需詳細資訊,請參閱 路徑 一節。

字元計數限制也可以不同,而且會根據使用的檔案系統和路徑名稱前置詞格式而有所不同。 支援回溯相容性機制會進一步複雜。 例如,較舊的 MS-DOS FAT 檔案系統最多支援 8 個字元的基底檔案名,副檔名最多支援 3 個字元,總共 12 個字元,包括點分隔符號。 這通常稱為 8.3 檔案名。 Windows FAT 和 NTFS 檔案系統不限於 8.3 檔案名,因為它們具有 長檔名支援,但仍支援 8.3 版的長檔名。

命名規範

下列基本規則可讓應用程式建立及處理檔案和目錄的有效名稱,而不論檔案系統為何:

  • 使用句號來分隔基底檔案名與目錄或檔案名稱中的副檔名。

  • 使用反斜線 (\) 分隔路徑元件。 反斜線會將檔案名從其路徑分割,並將一個目錄名稱從路徑中的另一個目錄名稱分割。 您無法在實際檔案或目錄的名稱中使用反斜線,因為它是將名稱分隔成元件的保留字元。

  • 視需要使用反斜線作為 磁片區名稱的一部分,例如 「C:\」在 「C:\path\file」 或 「\\server\share」 中的 「\\server\share\file」 中,用於通用命名慣例 (UNC) 名稱。 如需 UNC 名稱的詳細資訊,請參閱 最大路徑長度限制 一節。

  • 請勿假設區分大小寫。 例如,假設 OSCAR、Oscar 和 oscar 的名稱相同,即使某些檔案系統 (,例如 POSIX 相容檔案系統) 可能會將它們視為不同。 請注意,NTFS 支援區分大小寫的 POSIX 語意,但這不是預設行為。 如需詳細資訊,請參閱 CreateFile

  • 磁片區指定符 (磁碟機號) 類似不區分大小寫。 例如,「D:\」和 「d:\」參考相同的磁片區。

  • 使用目前字碼頁中的任何字元作為名稱,包括擴充字元集中的 Unicode 字元和字元, (128-255) ,但下列情況除外:

    • 下列保留字元:

      • < (小於)
      • > (大於)
      • : (冒號)
      • " (雙引號)
      • / (正斜線)
      • \ (反斜線)
      • | (垂直線或管道)
      • ? (問號)
      • * (星號)
    • 整數值零,有時稱為 ASCII NUL 字元。

    • 整數表示範圍從 1 到 31 的字元,但允許這些字元的替代資料流程除外。 如需檔案資料流程的詳細資訊,請參閱 檔案資料流程

    • 目的檔案系統不允許的任何其他字元。

  • 使用句號做為路徑中的目錄 元件 來代表目前目錄,例如 「.\temp.txt」。 如需詳細資訊,請參閱 路徑

  • 使用 (的兩個連續句點。) 做為路徑中的目錄 元件 ,以代表目前目錄的父系,例如 「.。\temp.txt」。 如需詳細資訊,請參閱 路徑

  • 請勿將下列保留名稱用於檔案名:

    CON、PRN、AUX、NUL、COM0、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、LPT0、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8 和 LPT9。 也請避免這些名稱緊接在延伸模組後面;例如,NUL.txt和 NUL.tar.gz 都相當於 NUL。 如需詳細資訊,請參閱 命名空間

  • 請勿以空格或句號結束檔案或目錄名稱。 雖然基礎檔案系統可能支援這類名稱,但 Windows 殼層和使用者介面則不支援。 不過,可以接受將句號指定為名稱的第一個字元。 例如,「.temp」。

簡短與長名稱

長檔名會被視為任何超過簡短 MS-DOS (也稱為 8.3) 樣式命名慣例的檔案名。 當您建立長檔名時,Windows 可能也會建立名稱的簡短 8.3 格式,稱為 8.3 別名 或簡短名稱,並將它儲存在磁片上。 視特定檔案系統而定,基於全系統或指定磁片區的效能考慮,可以停用這個 8.3 別名。

Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 在 Windows 7 和 Windows Server 2008 R2 之前,無法停用指定磁片區的 8.3 別名。

在許多檔案系統上,檔案名會在名稱的每個元件內包含波浪線 (~) ,且名稱太長而不符合 8.3 命名規則。

注意

並非所有檔案系統都遵循波浪線替代慣例,而且系統可以設定為停用 8.3 別名產生,即使它們通常支援它也一樣。 因此,請勿假設 8.3 別名已存在於磁片上。

 

若要從系統要求 8.3 檔案名、長檔名或檔案的完整路徑,請考慮下列選項:

在較新的檔案系統上,例如 NTFS、exFAT、UDFS 和 FAT32,Windows 會將長檔名儲存在 Unicode 的磁片上,這表示一律會保留原始的長檔名。 即使長檔名包含擴充字元,也是如此,不論磁片讀取或寫入作業期間作用中的字碼頁為何。

使用長檔名的檔案可以在 NTFS 檔案系統分割區與 Windows FAT 檔案系統磁碟分割之間複製,而不會遺失任何檔案名資訊。 根據實際的檔案名而定,較舊的 MS-DOS FAT 和某些類型的 CDFS (CD-ROM) 檔案系統可能不正確。 在此情況下,會盡可能取代簡短檔案名。

路徑

指定檔案 的路徑 是由一或多個 元件所組成,並以特殊字元分隔, (反斜線) ,每個元件通常都是目錄名稱或檔案名,但下面討論一些值得注意的例外狀況。 系統對於路徑開頭或前置詞的解譯通常很重要。路徑的開頭或 前置詞看起來像這樣。 此前置詞會決定路徑所使用的 命名空間 ,以及路徑內的位置使用哪些特殊字元,包括最後一個字元。

如果路徑的元件是檔案名,它必須是最後一個元件。

路徑的每個元件也會受限於為特定檔案系統指定的最大長度。 一般而言,這些規則分為兩個類別: 。 請注意,目錄名稱是由檔案系統儲存為特殊類型的檔案,但檔案的命名規則也適用于目錄名稱。 總而言之,路徑只是存在於特定檔案或目錄名稱之所有目錄之間的階層字串表示。

完整路徑與相對路徑

對於操作檔案的 Windows API 函式,檔案名通常相對於目前的目錄,而某些 API 則需要完整路徑。 如果檔案名不是以下列其中一項開頭,則檔案名會相對於目前目錄:

  • 任何格式的 UNC 名稱,一律以兩個反斜線字元開頭 (「\\」) 。 如需詳細資訊,請參閱下一節。
  • 具有反斜線的磁片指示項,例如 「C:\」或 「d:\」。
  • 單一反斜線,例如 「\directory」 或 「\file.txt」。 這也稱為 絕對路徑

如果檔案名只以磁片指示項開頭,但不是冒號之後的反斜線,則會解譯為磁片磁碟機上具有指定字母之目前目錄的相對路徑。 請注意,根據目前磁片上最近「變更目錄」作業所設定的內容,目前目錄可能不是根目錄。 此格式的範例如下所示:

  • 「C:tmp.txt」 是指磁片磁碟機 C 上目前目錄中名為 「tmp.txt」 的檔案。
  • 「C:tempdir\tmp.txt」 是指磁片磁碟機 C 上目前目錄的子目錄中的檔案。

如果路徑包含 「double-dots」,則路徑也會稱為相對路徑;也就是說,路徑的一個元件中有兩個句點。 這個特殊規範可用來表示目前目錄上方的目錄,否則稱為「父目錄」。 此格式的範例如下所示:

  • "..\tmp.txt「 指定位於目前目錄父系tmp.txt名為 的檔案。
  • "..\..\tmp.txt」 指定目前目錄上方兩個目錄的檔案。
  • "..\tempdir\tmp.txt」 指定名為 tmp.txt 的檔案,該檔案位於名為 tempdir 的目錄中,該目錄是目前目錄的對等目錄。

相對路徑可以合併這兩種範例類型,例如「C:..\tmp.txt」。 這很有用,因為雖然系統會追蹤目前的磁片磁碟機以及該磁片磁碟機的目前目錄,但是如果您的系統有多個) 磁片磁碟機,則不論哪些磁片磁碟機指示項設定為目前的磁片磁碟機,它也會追蹤每個不同磁碟機號中的目前目錄, (。

路徑長度上限

在 Windows 10 1607 版之前的 Windows 版本中,路徑的最大長度是MAX_PATH,定義為 260 個字元。 在較新版本的 Windows 中,需要變更登錄機碼或使用群組原則工具來移除限制。 如需完整詳細資料,請參閱 路徑長度上限限制

命名空間

Windows API 中使用的命名空間慣例有兩個主要類別,通常稱為 NT 命名空間Win32 命名空間。 NT 命名空間的設計目的是做為其他子系統和命名空間可能存在的最低層級命名空間,包括 Win32 子系統,以及依延伸模組的 Win32 命名空間。 POSIX 是 Windows 中建置在 NT 命名空間之上的子系統的另一個範例。 舊版 Windows 也定義了數個預先定義或保留的特定特殊裝置名稱,例如通訊 (序列和平行) 埠和預設顯示主控台,作為現在稱為 NT 裝置命名空間的一部分,而且目前版本的 Windows 仍支援回溯相容性。

Win32 檔案命名空間

本節和下一節摘要說明 Win32 命名空間前置詞和慣例,並說明其使用方式。 請注意,這些範例適用于與 Windows API 函式搭配使用,而且不一定會使用 Windows Shell 應用程式,例如 Windows 檔案總管。 基於這個理由,可能路徑的範圍比通常可從 Windows 殼層應用程式取得,而利用此方式的 Windows 應用程式可以使用這些命名空間慣例來開發。

若為檔案 I/O,路徑字串的 「\\?\」 前置詞會告訴 Windows API 停用所有字串剖析,並將後面緊接著的字串直接傳送至檔案系統。 例如,如果檔案系統支援大型路徑和檔案名,您可以超過 Windows API 所強制執行的 MAX_PATH 限制。 如需一般最大路徑限制的詳細資訊,請參閱上一節 最大路徑長度限制

因為它會關閉路徑字串的自動擴充,所以 「\\?\」 前置詞也允許在路徑名稱中使用 「..」 和 「.」,如果您嘗試在具有這些保留相對路徑規範的檔案上執行作業,這非常有用。

許多但並非所有檔案 I/O API 都支援 「\\?\」;您應該查看每個 API 的參考主題,以確定。

請注意,應該使用 Unicode API 確定 「\\?\」 前置詞可讓您超過 MAX_PATH

Win32 裝置命名空間

「\.\」 前置詞會存取 Win32 裝置命名空間,而不是 Win32 檔案命名空間。 如果 API 支援這種類型的存取,則如何直接存取實體磁片和磁片區,而不需要通過檔案系統。 您可以使用 CreateFileDefineDosDevice 函式, (以這種方式存取磁片以外的許多裝置,例如) 。

例如,如果您想要開啟系統的序列通訊埠 1,您可以在 CreateFile 函式的呼叫中使用 「COM1」。 這可運作,因為 COM1–COM9 是 NT 命名空間中保留名稱的一部分,雖然使用 「\\.\」 前置詞也會使用這些裝置名稱。 相較之下,如果您已安裝 100 個埠序列擴充板,而且想要開啟 COM56,則無法使用 「COM56」 開啟它,因為 COM56 沒有預先定義的 NT 命名空間。 您必須使用 「\\.\COM56」 開啟它,因為 「\\.\」 會直接移至裝置命名空間,而不嘗試找出預先定義的別名。

另一個使用 Win32 裝置命名空間的範例是使用 CreateFile 函式搭配 「\\.\PhysicalDriveX」 (其中 X 是有效的整數值) 或 「\\.\CdRomX」。 這可讓您直接存取這些裝置,略過檔案系統。 這可運作,因為這些裝置名稱是由系統建立,因為這些裝置會列舉這些裝置,而有些驅動程式也會在系統中建立其他別名。 例如,實作名稱 「C:\」 的裝置驅動程式有自己的命名空間,也會是檔案系統。

透過 CreateFile 函式的 API 通常會使用 「\\.\」 前置詞,因為 CreateFile 是用來開啟檔案和裝置的函式,視您使用的參數而定。

如果您使用 Windows API 函式,您應該使用 「\\.\」 前置詞來僅存取裝置,而不是檔案。

大部分的 API 都不支援 「\\.\」;只有設計來搭配裝置命名空間使用的裝置命名空間才會辨識它。 請一律檢查每個 API 的參考主題,以確定。

NT 命名空間

另外還有一個 API 允許使用 NT 命名空間慣例,但 Windows 物件管理員在大部分情況下會進行不必要的動作。 為了說明,使用 Windows Sysinternals WinObj 工具流覽系統物件瀏覽器中的 Windows 命名空間很有用。 當您執行此工具時,您會看到從根目錄或 「\」 開始的 NT 命名空間。 名為 「Global??」 的子資料夾是 Win32 命名空間所在的位置。 具名裝置物件位於 「Device」 子目錄中的 NT 命名空間中。 在這裡,您也可以找到 Serial0 和 Serial1,如果系統上存在,代表前兩個 COM 埠的裝置物件。 代表磁片區的裝置物件會像 「HarddiskVolume1」,不過數值尾碼可能會有所不同。 子目錄 「Harddisk0」 下的名稱 「DR0」 是代表磁片的裝置物件範例,依此類故。

若要讓 Windows 應用程式存取這些裝置物件,設備磁碟機會在 Win32 命名空間 「Global??」中建立符號連結 (符號連結) 。 例如,「Global??」 子目錄下的 COM0 和 COM1 只是與 Serial0 和 Serial1 的符號連結,「C:」 是 HarddiskVolume1、「Physicaldrive0」 是 DR0 的符號連結等等。 如果沒有符號連結,任何使用 Win32 命名空間慣例的 Windows 應用程式將無法使用指定的裝置 「Xxx」,如先前所述。 不過,您可以使用支援 「\Device\Xxx」 格式之 NT 命名空間絕對路徑的任何 API,將控制碼開啟至該裝置。

透過終端機服務和虛擬機器新增多使用者支援後,必須進一步虛擬化 Win32 命名空間內的全系統根裝置。 這是藉由將名為 「GLOBALROOT」 的符號連結新增至 Win32 命名空間來完成,您可以在先前討論之 WinObj 瀏覽器工具的 「Global??」 子目錄中看到,而且可以透過路徑 「\\?\GLOBALROOT」 進行存取。 此前置詞可確保其後面的路徑會在系統物件管理員的 true 根路徑中尋找,而不是與會話相關的路徑。

檔案系統功能比較