當我第一次啓用日誌記錄功能時,我注意到其中一個項目中性能巨大。但是,當達到日誌文件限制並且程序開始再次寫入文件的開頭時,日誌記錄速度要快得多(大約快50%)。將日誌文件大小設置爲數百MB是正常的。在爲效率編寫文件之前預留磁盤空間
在開始下載文件之前,大多數下載管理器會分配具有所需大小的虛擬文件。這使得寫入更加有效,因爲整個塊被一次分配。
當我的程序第一次啓動時,以某種固定大小有效地保留磁盤空間的最佳方式是什麼?
當我第一次啓用日誌記錄功能時,我注意到其中一個項目中性能巨大。但是,當達到日誌文件限制並且程序開始再次寫入文件的開頭時,日誌記錄速度要快得多(大約快50%)。將日誌文件大小設置爲數百MB是正常的。在爲效率編寫文件之前預留磁盤空間
在開始下載文件之前,大多數下載管理器會分配具有所需大小的虛擬文件。這使得寫入更加有效,因爲整個塊被一次分配。
當我的程序第一次啓動時,以某種固定大小有效地保留磁盤空間的最佳方式是什麼?
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
}
謝謝。這正是我想要的。 – haggag
wRAR是正確的。 使用您最喜歡的庫打開一個新文件,然後查找倒數第二個字節並在其中寫入0。這應該分配所有需要的磁盤空間。
這裏有一個簡單的功能,將任意大小的文件的工作:
void SetFileSize(HANDLE hFile, LARGE_INTEGER size)
{
SetFilePointer(hFile, size, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
}
您可能希望將文件指針設置回開頭 –
可以使用SetFileValidData功能來擴展文件的邏輯長度,而不必所有的數據寫出來磁盤。但是,因爲它可以允許讀取您可能未被授權的磁盤數據,所以它需要使用SE_MANAGE_VOLUME_NAME
權限。仔細閱讀文檔的備註部分。
也執行SetFileValidData取決於fs驅動程序。 從Win7開始,NTFS才支持它和FAT。
這是一個Windows問題,而不是C++問題。這是Windows API的問題,而不是如何用C++程序調用它。我建議刪除C++標籤;這裏有很多.NET類型的人知道要尋找什麼。 –
可能的[如何在Windows上爲C/C++中的文件預分配空間?](https://stackoverflow.com/questions/7970333/how-do-you-pre-allocate-space-for- a-file-in-cc-on-windows) –
爲什麼不能用你想要的任何大小創建一個空的日誌? – wRAR