2
在我們的應用程序中,我們正在生成一些大的ASCII日誌文件到Windows NTFS壓縮目錄。我的用戶想要知道應用程序狀態屏幕上文件的壓縮和未壓縮大小。我們正在爲這個應用程序使用Rad Studio 2010 C++。在NTFS壓縮目錄中,如何讀取壓縮和解壓縮大小的文件?
我發現這個漂亮的遞歸過程在線讀取磁盤上的文件的大小 -
__int64 TransverseDirectory(string path)
{
WIN32_FIND_DATA data;
__int64 size = 0;
string fname = path + "\\*.*";
HANDLE h = FindFirstFile(fname.c_str(), &data);
if (h != INVALID_HANDLE_VALUE)
{
do
{
if ((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
if (strcmp(data.cFileName, ".") != 0 && strcmp(data.cFileName, "..") != 0)
{
// We found a sub-directory, so get the files in it too
fname = path + "\\" + data.cFileName;
// recurrsion here!
size += TransverseDirectory(fname);
}
}
else
{
LARGE_INTEGER sz;
sz.LowPart = data.nFileSizeLow;
sz.HighPart = data.nFileSizeHigh;
size += sz.QuadPart;
// ---------- EDIT ------------
if (data.dwFileAttributes & FILE_ATTRIBUTE_COMPRESSED)
{
unsigned long doNotCare;
fname = path + "\\" + data.cFileName;
DWORD lowWordCompressed = GetCompressedFileSize(fname.c_str(),
&doNotCare);
compressedSize += lowWordCompressed;
}
// ---------- End EDIT ------------
}
}
while (FindNextFile(h, &data) != 0);
FindClose(h);
}
return size;
}
但我無法找到是如何讀取壓縮/解壓縮的文件大小信息的任何信息。建議在哪裏看?
除非大小單獨存儲。然後你必須使用相同的邏輯來解壓縮文件來掃描整個文件並讀取它。 – 2010-08-18 18:00:32
@Martin - 這不是翻了一番。是的,你是正確的,你必須做兩次查找,但你可以將壓縮查找添加到主循環中。我已將我的工作查找代碼添加到上面的循環中。它不像應該那樣乾淨,但它只是我需要每分鐘運行一次,所以對我的應用程序來說已經足夠了。 – 2010-08-18 21:13:08