瞭解 Azure NetApp Files 中的路徑長度

檔案和路徑長度是指檔案路徑中的 Unicode 字元數目,包括目錄。 如果個別字元長度是由位元組位元的大小所決定,則此限制是一個因素。 例如,NFS 和 SMB 允許 255 個字節的路徑元件。 ASCII 的檔案編碼格式使用 8 位編碼,這表示 ASCII 中的檔案路徑元件(例如檔案或資料夾名稱)最多可以有 255 個字元,因為 ASCII 字元的大小為 1 位元組。

下表顯示 Azure NetApp Files 磁碟區中支援的元件和路徑長度:

元件 NFS SMB
路徑元件大小 255 個字節 255 個字節
路徑長度大小 不限定 默認值:255 個字節
更新 Windows 版本中的最大值:32,767 個字節
Transversal 的路徑大小上限 4,096 個字節 255 個字節

注意

雙通訊協定磁碟區會使用最低的最大值。

如果SMB共用名稱為 \\SMB-SHARE,則共用名稱會將11個Unicode字元新增至路徑長度,因為每個字元都是1位元組。 如果特定檔案的路徑為 \\SMB-SHARE\apps\archive\file,則為 29 個 Unicode 字元;每個字元,包括斜線,都是 1 個字節。 針對 NFS 掛接,適用相同的概念。 掛接路徑 /AzureNetAppFiles 是 17 個 Unicode 字元,每個字元 1 個字節。

Azure NetApp Files 針對新式 Windows 伺服器支援的 SMB 共用支援相同的路徑長度: 最多 32,767 個字節。 不過,視 Windows 用戶端的版本而定,某些應用程式無法 支援超過 260 個字節的路徑。 個別路徑元件(斜線之間的值,例如檔案或資料夾名稱)最多支援 255 個字節。 例如,在 Azure NetApp Files 的檔案路徑中,使用拉丁大寫 “A” 的檔名(每個字元佔用 1 位元組),不能超過 255 個字元。

# mkdir 256charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

mkdir: cannot create directory ‘256charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa’: File name too long 

# mkdir 255charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

# ls | grep 255 
255charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 

辨別字元大小

Linux 公用程式 uniutils 可以藉由輸入字元實例的多個實例並檢視 位元組 位元組,來尋找 Unicode 字元的位元組大小。

範例 1: 拉丁大寫 A 會在每次使用時遞增 1 個字節(使用單一十六進位值 41,也就是 ASCII 字元的 0-255 範圍)。

# printf %b 'AAA' | uniname
character  byte  UTF-32   encoded as glyph      name
        0     0  000041   41             A      LATIN CAPITAL LETTER A
        1     1  000041   41             A      LATIN CAPITAL LETTER A
        2     2  000041   41             A      LATIN CAPITAL LETTER A

結果 1: AAA 名稱使用 255 個字節中的 3 個字節。

範例 2: 日文字符字會每個實例遞增 3 個字節。 這也可以由編碼為欄位下的 3 個不同的十六進位代碼值 (E5, AD, 97) 來計算。 每個十六進位值代表 1 個字節:

# printf %b '字字字' | uniname
character  byte  UTF-32   encoded as  glyph     name
        0     0  005B57   E5 AD 97       字      CJK character Nelson 1281
        1     3  005B57   E5 AD 97       字      CJK character Nelson 1281
        2     6  005B57   E5 AD 97       字      CJK character Nelson 1281

結果 2: 名為字字字的檔案會使用 255 個字節中的 9 個字節。

範例 3: 具有直立符號的字母 Ä 會使用每個實例 2 個字節(C3 + 84)。

# printf %b 'ÄÄÄ' | uniname
character  byte  UTF-32   encoded as     glyph  name
        0     0  0000C4   C3 84          Ä      LATIN CAPITAL LETTER A WITH DIAERESIS
        1     2  0000C4   C3 84          Ä      LATIN CAPITAL LETTER A WITH DIAERESIS
        2     4  0000C4   C3 84          Ä      LATIN CAPITAL LETTER A WITH DIAERESIS

結果 3: 名為 ÄÄÄÄ 的檔案使用 255 個字節的 6 個字節。

範例 4: Emoji 等 😃 特殊字元落入未定義的範圍,超過 Unicode 字元所使用的 0-3 個字節。 因此,它會使用 Surrogate 配對進行其字元編碼。 在此情況下,字元的每個實例都會使用 4 個字節。

# printf %b '😃😃😃' | uniname
character  byte       UTF-32 encoded as  glyph   name
        0     0  01F603   F0 9F 98 83    😃      Character in undefined range
        1     4  01F603   F0 9F 98 83    😃      Character in undefined range
        2     8  01F603   F0 9F 98 83    😃      Character in undefined range 

結果 4: 名為 😃😃😃 的檔案使用 255 個字節中的 12 個字節。

大部分的表情符號都屬於 4 位元組範圍,但最多可以達到 7 個字節。 在超過一千個標準表情符號中,大約180個位於 基本多語平面 (BMP)中,這表示可以根據客戶端對語言類型的支援,在 Azure NetApp Files 中顯示為文字或 emoji。

如需 BMP 和其他 Unicode 平面的詳細資訊,請參閱 瞭解 Azure NetApp Files 中的磁碟區語言。

位元位元組對路徑長度的影響

雖然路徑長度被認為是檔案或資料夾名稱中的字元數,但它實際上是 路徑中支援的位元組大小 。 由於每個字元都會將位元組大小新增至名稱,因此不同語言中的不同字元集支援不同的檔名長度。

請考量下列案例:

  • 檔案或資料夾會針對檔名重複拉丁字母字元 「A」。。 (例如,AAAAAAAA)

    由於 「A」 使用 1 個字節和 255 個字節是路徑元件大小限制,因此檔名中會允許 255 個 “A” 實例。

  • 檔案或資料夾會在其名稱中重複日文字元字。

    由於 「字」 的大小為 3 個字節,檔名長度限制會是 85 個字實例(3 個字節 * 85 = 255 個字節),或總共 85 個字元。

  • 檔案或資料夾會以其名稱重複笑臉表情符號 (😃) 。

笑臉表情符號 (😃) 使用 4 個字節,這表示只有 emoji 的檔名會允許總計 64 個字元(255 個字節/4 個字節)。

  • 檔案或資料夾使用不同字元的組合(即名稱字😃)。

當不同位元組大小的不同字元用於檔案或資料夾名稱時,每個字元的位元組大小都會因檔案或資料夾長度而有所不同。 Name 字😃 的檔案或資料夾名稱會使用總計 255 位元組長度的 1+1+1+1+3+4 位元組(11 個字節)。

特殊表情符號概念

特殊表情符號,例如旗標 emoji,存在於 BMP 分類之下:emoji 會根據客戶端支持轉譯為文字或影像。 當用戶端不支援影像指定時,它會改用區域文字型指定。

例如,美國 旗標會使用 「us」 字元(這類似於拉丁字元 U+S,但實際上是使用不同編碼的特殊字元)。 Uniname 會顯示字元之間的差異。

# printf %b 'US' | uniname
character  byte  UTF-32   encoded as     glyph  name
        0     0  000055   55             U      LATIN CAPITAL LETTER U
        1     1  000053   53             S      LATIN CAPITAL LETTER S


# printf %b '🇺🇸' | uniname
character  byte  UTF-32   encoded as     glyph  name
        0     0  01F1FA   F0 9F 87 BA    🇺      Character in undefined range
        1     4  01F1F8   F0 9F 87 B8    🇸      Character in undefined range

為旗標 emoji 指定的字元會轉譯為支持系統中的影像旗標,但在不支持的系統中保留為文字值。 當使用旗標 emoji 時,這些字元會針對總計 8 個字節使用每個字元 4 個字節。 因此,檔名中總共允許 31 個旗標表情符號(255 個字節/8 個字節)。

SMB 路徑限制

根據預設,Windows 伺服器和客戶端支援最多 260 個字節的路徑長度,但實際的檔案路徑長度較短,因為元數據會新增至 Windows 路徑,例如<NUL>和網域資訊。

在 Windows 中超過路徑限制時,會出現對話框:

Screenshot of path length dialog warning.

使用 Windows 10/Windows Server 2016 1607 版或更新版本時,可以擴充 SMB 路徑長度,方法是變更登錄值,如路徑長度上限限制中所述。 當此值變更時,路徑長度最多可延伸至 32,767 個字節(減去元數據值)。

Screenshot of Group Policy Management window.

Screenshot of window to enable long file paths.

啟用此功能之後,您必須使用 \\?\ 路徑中的 來存取 SMB 共用需求,以允許較長的路徑長度。 此方法不支援 UNC 路徑,因此 SMB 共用必須對應至驅動器號。

Screenshot of dialog window with undiscoverable path.

使用 \\?\Z: 可改為允許存取,並支援較長的檔案路徑。

Screenshot of a directory with a long name.

注意

Windows CMD 目前不支援 使用 \\?\

如果無法增加路徑長度上限,則因應措施

如果 Windows 環境中無法啟用路徑長度上限,或 Windows 用戶端版本太低,則有因應措施。 您可以更深入地掛接SMB共用至目錄結構,並減少查詢的路徑長度。

例如,與其對應 \\NAS-SHARE\AzureNetAppFilesZ:,而是對應 \\NAS-SHARE\AzureNetAppFiles\folder1\folder2\folder3\folder4Z:

NFS 路徑限制

Azure NetApp Files 磁碟區的 NFS 路徑限制對於個別路徑元件具有相同的 255 位元組限制。 不過,每個元件會一次評估一個,而且每個要求最多可以處理 4,096 個字節,且路徑長度幾乎無限。 例如,如果每個路徑元件為 255 個字節,則 NFS 用戶端每個要求最多可以評估 15 個元件(包括 / 字元)。 因此, cd 超過 4,096 位元組限制之路徑的要求會產生「檔名太長」錯誤訊息。

在大部分情況下,Unicode 字元為 1 位元組或更少,因此 4,096 位元組的限制會對應至 4,096 個字元。 如果字元的大小大於1位元組,則路徑長度小於4,096個字元。 大小大於1位元組的位元會根據字元總數計算超過1位元組字元。

您可以使用 命令來查詢 getconf PATH_MAX /NFSmountpoint 路徑長度上限。

注意

限制定義於 limits.h NFS 用戶端的 檔案中。 您不應該調整這些限制。

雙重通訊協定磁碟區考慮

使用 Azure NetApp Files 進行雙重通訊協定存取時,在 NFS 和 SMB 通訊協定中如何處理路徑長度的差異,可以在檔案和資料夾之間建立不相容。 例如,Windows SMB 支援路徑中最多 32,767 個字元(前提是 SMB 用戶端上已啟用長路徑功能),但 NFS 支援可能會超過該數量。 因此,如果在超過SMB支援的NFS中建立路徑長度,用戶端就無法在達到路徑長度上限後存取數據。 在這些情況下,在建立檔案和文件夾名稱(以及資料夾路徑深度)時,請小心考慮跨通訊協定的檔案路徑長度下限,或將SMB共用對應到所需的資料夾路徑,以減少路徑長度。

請考慮將SMB共用對應至 整個路徑,而不是將SMB共用對應至磁碟區的最上層,以巡覽至的路徑\\share\folder1\folder2\folder3\folder4\\share\folder1\folder2\folder3\folder4。 因此,對應到 Z: 所需資料夾中的驅動器號對應,並將路徑長度從 Z:\folder1\folder2\folder3\folder4\file 減少為 Z:\file

特殊字元考慮

Azure NetApp Files 磁碟區使用 C.UTF-8 的語言類型,其中包含許多國家/地區和語言,包括德文、斯拉夫文、希伯來文,以及大多數中文/日文/韓文(CJK)。 Unicode 中最常見的文字字元是 3 個字節或更少。 特殊字元,例如 emoji、音樂符號和數學符號,通常大於 3 個字節。 有些使用 UTF-16代理字組邏輯

如果您使用 Azure NetApp Files 不支援的字元,您可能會看到要求不同檔名的警告。

Screenshot of an invalid file name warning.

相較於名稱太長,錯誤實際上會導致字元位元組大小太大,而無法透過SMB使用 Azure NetApp Files 磁碟區。 Azure NetApp Files 中沒有因應措施可進行這項限制。 如需 Azure NetApp Files 中特殊字元處理的詳細資訊,請參閱 使用特殊字元集的通訊協議行為。

下一步