新建文件夾需要佔用硬碟空間嗎?路徑長度有沒有限制?

如果新建文件夾也要佔用空間的話,硬碟滿了再新建文件夾會提示什麼?如果不佔用空間,是靠什麼記錄文件夾名稱的?

D:/新建文件夾/新建文件夾/新建文件夾/…………/新建文件夾…………可以有多長?(我還沒遇到過不能創建的情況,哪位大神比較無聊可以試一下)


新建文件夾需要佔磁碟空間。

以FAT和NTFS兩種文件系統分別討論:

(註:下面的回答里,目錄就是文件夾)

對於FAT文件系統:

文件名(不管它是文件還是目錄項)是保存在「目錄文件」里的。對於FAT來說,目錄其實是一個特殊的文件,它保存的是文件名和文件屬性信息等,一個目錄里的文件越多,目錄文件本身佔用的尺寸越大。

所以當磁碟滿的時候是無法創建新文件或者目錄的,即使它是空的,提示信息就是磁碟滿。

下圖就是一個目錄下新建一個空目錄時,在其父目錄里保存的名字信息:

對於FAT來說,還有更特殊的一點,FAT12/16的根目錄大小是固定的,所以根目錄下能新建的文件、目錄數是有限的,即使磁碟不滿,也可能會創建失敗。

對於NTFS文件系統:

同樣也有「目錄文件」這種概念,但對於內容較少的文件、目錄等對象,它的信息可能是保存在MFT里(MFT是一個特殊的文件,尺寸隨著磁碟上信息的增多而增加),當MFT里放不下的時候,會單獨拿出來變成一個文件。

具體的規則由於NTFS的規範不完全公開,所以無法詳細解答。

可以確認是文件名是需要佔用空間的,磁碟滿的時候是無法新建空文件或者目錄的。

最長路徑問題:

最長路徑有幾個限制:

1. 文件操作API限制:

比如Windows API里CreateFileA最大只能訪問MAX_PATH個字元(260個)的文件(名),但CreateFileW使用以"\?"方式能訪問32767個字元長的文件(名);

2. 文件系統驅動限制:

所有文件的操作都會發到文件系統驅動里,這裡的名字buffer都是有長度上限的,否則代碼會崩潰,具體長度記的不是太清楚,但大概都在32767以上(註:FAT中使用了MAX_LFN_CHARACTERS這個宏來定義單個文件名的長度,目前它的值是260);

3. 文件系統結構限制:

有些文件系統本身因為結構原因會有名字或者路徑的長度上限,具體跟結構相關,其實大多數文件系統理論上都沒有太多的限制,但軟體在設計時需要從實用性的角度去考慮,因此做了一些限定。

具體的限制需要參考這個鏈接(英文):Comparison of file systems

裡面有非常詳細的介紹。

-----------------------------

看到有人做實驗與我說的不符,我先放MSDN上的內容吧:

參考鏈接:Naming Files, Paths, and Namespaces (Windows)

先說為什麼實驗出來是248個字元:

When using an API to create a directory, the specified path cannot be so long that you cannot append an 8.3 file name (that is, the directory name cannot exceed MAX_PATH minus 12).

翻譯:MAX_PATH是260,創建文件夾的時候需要為8.3文件名保留12個字元,所以路徑部分的最大長度其實是248個(包括盤符和斜杠等),所以當路徑長度是248的時候,還可以打開這個文件夾並創建一個長度為11的文件(不可以是文件夾)。

如果創建更長的路徑,必須用代碼寫,因為Windows資源管理器等軟體都不是用"\?"方式訪問路徑的。

給個樣例代碼:

#include &
#include &
#include &
#include &

#define MAX_LEN 1024*1024 //1M Buffer上限,足夠了

char FullPath[MAX_LEN];
wchar_t FullPathW[MAX_LEN];

int main(int argc, char* argv[])
{
int i;
int CopySize;
BOOL Ret;
char b[2] = {"0"};
wchar_t bw[2] = {"9"};

printf("MAX_PATH is %d
", MAX_PATH);

//傳統方式創建文件夾
printf("Using CreateDirectoryA() to create directory:
");

_snprintf(FullPath, MAX_LEN, "E:\0");
i = strlen(FullPath);

while (i &< MAX_LEN - 1) { Ret = CreateDirectoryA(FullPath, NULL); if (Ret == FALSE) { printf("Creating directory failure during creating [%s] with length [%d] with error code [%d] ", FullPath, i, GetLastError()); break; } b[0]++; if (b[0] &> "9") b[0] -= 10;

strcat(FullPath, b);
i = strlen(FullPath);
}

//使用unicode創建文件夾
printf("Using CreateDirectoryW() to create directory:
");

_snwprintf(FullPathW, MAX_LEN, L"\\?\E:\9");
i = wcslen(FullPathW);
while (i &< MAX_LEN - 1) { Ret = CreateDirectoryW(FullPathW, NULL); if (Ret == FALSE) { printf("Creating directory failure during creating [%S] with length [%d] with error code [%d] ", FullPathW, i, GetLastError()); break; } bw[0]--; if (bw[0] &< "0") bw[0] += 10; wcscat(FullPathW, bw); i = wcslen(FullPathW); } printf("Using CreateDirectoryW() to create recurse directory: "); i--; FullPathW[i] = "\"; CopySize = i - 7; i = wcslen(FullPathW); // 測試最大深度 while (i &< MAX_LEN - 1) { if (i + CopySize &>= MAX_LEN)
{
printf("MAX_LEN is too small
");
break;
}
memcpy(FullPathW + i, FullPathW + 7, CopySize * sizeof(wchar_t));

Ret = CreateDirectoryW(FullPathW, NULL);

i = wcslen(FullPathW);

if (Ret == FALSE)
{
printf("Creating directory failure during creating [%S] with length [%d] with error code [%d]
", FullPathW, i, GetLastError());
break;
}
else
{
printf("Created directory [%S] with length [%d] success
", FullPathW, i);
}

FullPathW[i] = "\";
i++;
}

while(TRUE)
{
FullPathW[--i] = 0;
i = wcslen(FullPathW);
if (CreateDirectoryW(FullPathW, NULL) == TRUE)
{
printf("Created directory [%S] with length [%d] success
", FullPathW, i);
break;
}
/*printf("[%S]
", FullPathW);*/
}

return 0;
}

實驗結果是,大概能創建總長度達到32743個Unicode字元的文件名。

需要注意的是,這樣創建出來的文件夾是在資源管理器(XP/7,沒有WIN8環境)里刪不掉,也訪問不了的,但是用WINHEX之類的工具是可以的。

----------------------------------------------------------------

無法創建文件夾時磁碟未必一定就是滿的:

比如對於FAT12/16文件系統,根目錄的文件個數是有限的,創建一個小於2G的分區,然後格式化成FAT,嘗試在根目錄下創建文件,到一定數目時,創建就失敗了,但磁碟空間還有很多:

--------------------------------

FAT32和NTFS沒有單個目錄下的最大目錄項限制(實際上也有,只不過非常大),所以可以通過不停的創建文件夾的方式把磁碟放滿。

不要參考資源管理器里顯示的佔用空間,通過其它工具查看是比較合理的,比如有1000個子目錄的文件夾:


新建文件夾必然是要佔用磁碟空間的。

文件路徑長度這個問題就比較複雜了,因為在不同的應用場景和不同的code path下是不一樣的。

本身在NTFS文件系統這一層幾乎可以算沒限制(具體待查),但Windows系統API會造成額外的限制。比如ANSI版本的API,其MAX_PATH是260。而unicode版本可以到三萬多。如果你用unicode api建出一個很長路徑的文件,用ansi api也將無法打開。

另外,除了api之外,各個應用程序也可能有自己的限制,包括資源管理器等。


其實第一個問題還可以從其他角度分析,假若文件夾不佔空間的話,我們便可以將信息用文件夾名的方式無限存儲下去了。。


只說路徑長度:
NTFS 的 \? 命名空間路徑是 32767 個 UTF-16 WCHAR。nodejs 的所有文件 IO 都是走這個
標準 win32 API 是 260 個位元組(帶驅動器號)
Linux 似乎是 4096 個位元組(limits.h 中,PATH_MAX)


目錄佔用空間:
首先是 inode 本身佔用的空間。EXT2_GOOD_OLD_INODE_SIZE 為 128 位元組,而 ext4 inode 默認為 256 位元組。
除此之外,還有目錄名稱本身:比如 struct ext4_dir_entry_2,其最大為 263 位元組。

路徑長度限制:參見 linux/limits.h:12

#define PATH_MAX 4096


首先必須佔用空間,存放在節點信息裡面

path是有長度的,一般是256位元組甚至1024位元組數組,每個fs設計不一樣,有自己應用考量

path是一串可以解析的路徑名(系統起來,方便使用者而已創建的一塊內存),給你匹配一個個節點名稱(存在硬碟的是有樹關係的節點,就沒路徑名了),然後找到對應的文件或文件夾(在Linux一切皆文件)

文件夾本身是有數據的,比如你的創建時間,使用者及許可權信息都是需要被記錄的(meta data)

所以,不能憑空造輪子哦,根據能量守恆定律,有其然必有所起然,謝謝。


創建文件或文件夾,本身沒內容不佔硬碟。
但會在硬碟中建立索引,目錄結構信息,
這些信息同樣是寫入硬碟的,所以肯定會滿。

這問題其實有點搞笑,就像是小孩子問我,
往瓶子里吹氣是否會滿,你吹吹看看?

第二個問題,《一般程序員》都知道
#define MAX_PATH 260
文件名最長256位元組 ANSI
盤符佔三位元組 C :/ , 加上結束符
佔一個位元組

所以 X:/ +(256位元組路徑)+ 結束符 = 260位元組

對我們來說是一加一等於幾是一樣的問題,
我之所以回答問題,因為一個贊也是贊啊!
再說這麼簡單的問題。


小的時候試過做密碼文件夾,就是一個套10個,一層一層做。做到後面就有進度條了


新建文件夾需要佔硬碟空間,占的大小,取決於你文件夾的名字,有最大、最小的限制。

路徑是有限制的,不同的文件系統格式,路徑有所不同

推薦你看《鳥哥的Linux私房菜》
鳥哥的 Linux 私房菜 -- 第七章、Linux 磁碟與檔案系統管理

雖然說的是Ext2格式,但與FAT、NTFS是類似的。


只有我認為這是個很傻的問題嗎。普通PC物理存儲就是硬碟,文件夾算記錄,你說一個空的道林紙夾要不要空間


推薦閱讀:

為什麼單個大文件比總體積相同的多個小文件複製起來要快很多?

TAG:操作系統 | 計算機 | 文件系統 |