2010-08-18 144 views
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; 
} 

但我無法找到是如何讀取壓縮/解壓縮的文件大小信息的任何信息。建議在哪裏看?

+0

除非大小單獨存儲。然後你必須使用相同的邏輯來解壓縮文件來掃描整個文件並讀取它。 – 2010-08-18 18:00:32

+0

@Martin - 這不是翻了一番。是的,你是正確的,你必須做兩次查找,但你可以將壓縮查找添加到主循環中。我已將我的工作查找代碼添加到上面的循環中。它不像應該那樣乾淨,但它只是我需要每分鐘運行一次,所以對我的應用程序來說已經足夠了。 – 2010-08-18 21:13:08

回答