首先,先說一下遇到問題的背景;我們公司需要上報一些檔案,不限制格式;而且對於大於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
既然來了,那就認識下,掃描關注下日後多交流!