2010-08-18 12 views
2

Dans notre application, nous générons de gros fichiers journaux ASCII dans un répertoire compressé Windows NTFS. Mes utilisateurs veulent connaître à la fois la taille compressée et non compressée des fichiers sur un écran d'état de l'application. Nous utilisons Rad Studio 2010 C++ pour cette application.Dans NTFS Compressed Directory, Comment lire les fichiers compressés et taille non compressée?

Je trouve cette belle routine récursive en ligne pour lire la taille des fichiers sur le disque -

__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; 
} 

Mais ce que je ne peux pas trouver est des informations sur la façon de lire les informations de taille de fichier non compressé/compressé. Suggestions sur où chercher?

+0

Sauf si la taille est enregistrée séparément. Ensuite, vous devez littéralement utiliser la même logique qui décompresse le fichier pour analyser le fichier entier et le lire. –

+0

@Martin - Ce n'est pas tout à fait doublé. Oui, vous avez raison de faire deux recherches, mais vous pouvez ajouter la recherche compressée dans la boucle principale. J'ai ajouté mon code de recherche de travail dans la boucle ci-dessus. Ce n'est pas aussi propre qu'il devrait l'être, mais c'est quelque chose que je n'ai besoin de lancer qu'une fois par minute, donc c'est assez bon pour mon application. –

Répondre