2010-03-01 43 views
14

當我第一次啓用日誌記錄功能時,我注意到其中一個項目中性能巨大。但是,當達到日誌文件限制並且程序開始再次寫入文件的開頭時,日誌記錄速度要快得多(大約快50%)。將日誌文件大小設置爲數百MB是正常的。在爲效率編寫文件之前預留磁盤空間

在開始下載文件之前,大多數下載管理器會分配具有所需大小的虛擬文件。這使得寫入更加有效,因爲整個塊被一次分配。

當我的程序第一次啓動時,以某種固定大小有效地保留磁盤空間的最佳方式是什麼?

+0

這是一個Windows問題,而不是C++問題。這是Windows API的問題,而不是如何用C++程序調用它。我建議刪除C++標籤;這裏有很多.NET類型的人知道要尋找什麼。 –

+0

可能的[如何在Windows上爲C/C++中的文件預分配空間?](https://stackoverflow.com/questions/7970333/how-do-you-pre-allocate-space-for- a-file-in-cc-on-windows) –

+1

爲什麼不能用你想要的任何大小創建一個空的日誌? – wRAR

回答

8
void ReserveSpace(LONG spaceLow, LONG spaceHigh, HANDLE hFile) 
{ 
    DWORD err = ::SetFilePointer(hFile, spaceLow, &spaceHigh, FILE_BEGIN); 

    if (err == INVALID_SET_FILE_POINTER) { 
     err = GetLastError(); 
     // handle error 
    } 
    if (!::SetEndOfFile(hFile)) { 
     err = GetLastError(); 
     // handle error 
    } 
    err = ::SetFilePointer(hFile, 0, 0, FILE_BEGIN); // reset 
} 
+0

謝謝。這正是我想要的。 – haggag

4

wRAR是正確的。 使用您最喜歡的庫打開一個新文件,然後查找倒數第二個字節並在其中寫入0。這應該分配所有需要的磁盤空間。

+0

是真的嗎?我一直認爲NTFS支持文件漏洞,但是我現在找不到它的源代碼。 – dmeister

+1

「大多數應用程序不知道稀疏文件,也不會創建稀疏文件,應用程序讀取稀疏文件的事實對應用程序是透明的,知道稀疏文件的應用程序應確定其數據集是否合適保存在一個稀疏文件中,在做出確定後,應用程序必須使用FSCTL_SET_SPARSE控制代碼顯式聲明一個文件爲稀疏文件。「 – wRAR

+1

正如wRAR所暗示的,NTFS支持文件漏洞,但您必須使用FSCTL_SET_SPARSE或通過設置要壓縮的文件來顯式創建。 – Gabe

0

這裏有一個簡單的功能,將任意大小的文件的工作:

void SetFileSize(HANDLE hFile, LARGE_INTEGER size) 
{ 
    SetFilePointer(hFile, size, NULL, FILE_BEGIN); 
    SetEndOfFile(hFile); 
} 
+1

您可能希望將文件指針設置回開頭 –

0

可以使用SetFileValidData功能來擴展文件的邏輯長度,而不必所有的數據寫出來磁盤。但是,因爲它可以允許讀取您可能未被授權的磁盤數據,所以它需要使用SE_MANAGE_VOLUME_NAME權限。仔細閱讀文檔的備註部分。

也執行SetFileValidData取決於fs驅動程序。 從Win7開始,NTFS才支持它和FAT。