File name too long window和linux排查,解決

逝年的我们發表於2024-03-04

首先,先說一下遇到問題的背景;我們公司需要上報一些檔案,不限制格式;而且對於大於50M的檔案pdf,壓縮包等必須拆分和重新命名;從開發到測試和目前的執行一直沒有問題;最近在正常下載和上報時發現了個別檔案沒有下載下來;透過排查日誌發現報下面的錯;

原來是檔名太長了,透過查詢資料瞭解到原來作業系統對這些都做了限制;而且每個版本可能都會存在不同的限制;

在 Windows API ((以下段落) 中介紹的一些例外情況)中,路徑的最大長度為 MAX_PATH,定義為 260 個字元。 本地路徑按以下順序構建:驅動器號、冒號、反斜槓、用反斜槓分隔的名稱元件以及終止 null 字元。 例如,驅動器 D 上的最大路徑為“D:\some 256 個字元的路徑字串<NUL>”,其中“<NUL>”表示當前系統內碼表的不可見終止 null 字元。 (此處使用的字元 <> 是為了直觀明瞭,不能是有效路徑 string 的一部分。)

例如,如果將具有長檔名的 git 儲存庫克隆到本身具有長名稱的資料夾,則可能會達到此限制。

詳細資料大家可以查閱:https://learn.microsoft.com/zh-cn/windows/win32/fileio/maximum-file-path-limitation?tabs=registry

作業系統檔名最大長度(位元組)路徑最大長度
Linux 255 4096
MAC 255 1024
Windows(未開啟長檔名) 255 260
Windows(開啟長檔名) 255 32767

上面的圖例大家可以參考,具體可能還需要根據自身裝的系統進行詳細的查詢。

詳細說明:

1、linux

Linux的 /usr/include/linux/limits.h 中做出了說明

#ifndef _LINUX_LIMITS_H
#define _LINUX_LIMITS_H
#define NAME_MAX 255 /* # chars in a file name */
#define PATH_MAX 4096 /* # chars in a path name including nul */
#endif

這些限制在Linux系統下可以透過修改系統核心修改這個限制。

Linux檔名和目錄的長度限制是255個字元(位元組,linux中所說的字元是以ascii碼來編碼的)

2 windows

Windows 通常限定檔名最多包含 260 個字元(一個漢字佔用兩個字元哦)。但實際的檔名必須少於這一數值,因為完整路徑(如 C:\Program Files\filename.txt)都包含在此字元數值中。
windows下完全限定檔名必須少於260個字元,目錄名必須小於248個字元。(包含目錄資料夾)
win7x64位環境:
260個長度是作為總的檔名長度限制。
如果在程式中的話,超出長度的話MoveFile/CopyFile會返回錯誤,處理失敗。

                        

3 mac

檔名最長255位元組(包含副檔名),路徑最長:1024

既然來了,那就認識下,掃描關注下日後多交流!

相關文章