為甚麼文件佔用的空間會大於文件實際大小

發佈時間:2024-06-04

以windows系統舉例,先看幾張圖:

圖1:文件的大小比佔用空間更小。

image.png


圖2:文件的大小和佔用空間大小一致。

image.png


圖3:文件大小比佔用空間大小更大。

image.png

上面3張圖展示了文件大小與佔用空間的大小幾種情況,前兩種場景是比較常見的情況,之所以有時文件大小會比佔用空間小時因為簇大小的限制,簇代表了可以分配用來保存文件的最小磁盤空間量,存放sparse.txt文件所在區簇的大小為4096字節,圖1中文件大小為4096字節(可以使用chkdsk命令查看),所以5K的文件需要2個簇來存儲,如下圖所示:

image.png

圖2所示文件大小為5M,5M正好是4096的整數倍,所以文件大小跟佔用空間大小一樣大。

下面重點說下第三種情況,這裡涉及到稀疏文件問題,對於不支持稀疏文件的系統就不會出現這種情況,看個例子:

/**
     * 常規文件可能會有很多不必要的空間浪費
     * @throws IOException
     */
    @Test
    public void normalFile() throws IOException {
        File file = new File("d:/tmp/sparse.txt");
        Path path = file.toPath();
        FileChannel ch = FileChannel.open(path, StandardOpenOption.CREATE,StandardOpenOption.WRITE);
        ch.position(5*1024*1024L);
        ch.write(ByteBuffer.wrap("hello world".getBytes("utf-8")));
        ch.close();

    }

    /**
     * 稀疏文件模式
     * @throws IOException
     */
    @Test
    public void sparseFile() throws IOException {
        File file = new File("d:/tmp/sparse.txt");
        Path path = file.toPath();
        FileChannel ch = FileChannel.open(path, StandardOpenOption.SPARSE,StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE);
        ch.position(5*1024*1024L);
        ch.write(ByteBuffer.wrap("hello world".getBytes("utf-8")));
        ch.close();
    }


有的用戶會發現文件管理中統計的文件大小與實際空間佔用大小不一致,如空間大小提示超標文件大小未超標,也是因為這些原因導致的,綜上所述,我司系統檢測到的空間佔用大小為實際文件佔用空間的大小,而非文件本身的大小,如提示空間超標,請您升級空間大小,避免影響您的正常使用。


如您的主機配額超標很多,實際佔用空間不大,是因為有很多小的緩存文件,比如\runtime\session 路徑下的文件,如下圖:

image.png

這類情況如果通過FTP或文件管理器刪除太慢,請【提交工單】,可授權技術工程師為您批量刪除處理。