[WinAPI] Cum aflu dimensiunea unui fisier?

Folosire Windows API in programe C/C++ (forum moderat)

[WinAPI] Cum aflu dimensiunea unui fisier?

Mesajde Silviu Ardelean » 25 Noi 2010, 18:05

Intrebare: Cum aflu dimensiunea unui fisier?

Raspuns: O metoda este folosind functia FindFirstFile.

Exemplu
Cod: Selectaţi tot
ULONGLONG GetFileSize(LPCTSTR szFilePath)
{
   // NOTE: This is a draft example.
   // Not all tests are performed, e.g. if szFilePath is valid (see FindFirstFile documentation).

   ULONGLONG nSize = 0;
   WIN32_FIND_DATA findData = {0};
   HANDLE hFind = ::FindFirstFile(szFilePath, &findData);
   if(INVALID_HANDLE_VALUE != hFind)
   {
      ULARGE_INTEGER liSize = {findData.nFileSizeLow, findData.nFileSizeHigh};
      nSize = liSize.QuadPart;
      ::FindClose(hFind);
   }
   return nSize;
}


Vezi si:
Ultima oară modificat de Ovidiu Cucu pe 27 Noi 2010, 20:04, modificat de 2 ori în total.
Motiv: few cosmetics
Avatar utilizator
Silviu Ardelean
Senior
Senior
 
Mesaje: 1175
Membru din: 12 Iul 2007, 09:22
Localitate: Timisoara
Judet: Timiş

[WinAPI] Cum aflu dimensiunea unui fisier? (2)

Mesajde Ovidiu Cucu » 18 Iul 2011, 13:50

Raspuns
Pentru aflarea dimensiunii unui fisier se pot utiliza urmatoarele functii WinAPI:
  1. GetFileSize
    Exemplu
    Cod: Selectaţi tot
    DWORD _GetFileSize(LPCTSTR pszFileName, ULONGLONG& nSize)
    {
       DWORD dwRet = NO_ERROR;
       DWORD dwDesiredAccess = 0; // open just to query info
       HANDLE hFile = ::CreateFile(pszFileName,
          dwDesiredAccess, 0, NULL, OPEN_EXISTING,
          0, NULL);

       if(INVALID_HANDLE_VALUE != hFile)
       {
          DWORD dwFileSizeHi = 0;
          DWORD dwFileSizeLo = ::GetFileSize(hFile, &dwFileSizeHi);
          if(INVALID_FILE_SIZE == dwFileSizeLo)
          {
             // check if failed or really is a good low-part value
             dwRet = ::GetLastError();
          }
          if(NO_ERROR == dwRet)
          {
             LARGE_INTEGER liSize = {dwFileSizeLo, dwFileSizeHi};
             nSize = liSize.QuadPart; // file size in bytes
          }
          ::CloseHandle(hFile);
       }
       else
       {
          dwRet = ::GetLastError();
       }
       return dwRet; // NO_ERROR if succeeded
    }

  2. GetFileSizeEx
    Exemplu
    Cod: Selectaţi tot
    DWORD _GetFileSizeEx(LPCTSTR pszFileName, ULONGLONG& nSize)
    {
       DWORD dwRet = NO_ERROR;
       DWORD dwDesiredAccess = 0; // open just to query info
       HANDLE hFile = ::CreateFile(pszFileName,
          dwDesiredAccess, 0, NULL, OPEN_EXISTING,
          0, NULL);

       if(INVALID_HANDLE_VALUE != hFile)
       {
          LARGE_INTEGER liSize = {0};
          if(::GetFileSizeEx(hFile, &liSize))
             nSize = liSize.QuadPart; // file size in bytes
          else
             dwRet = ::GetLastError();
          ::CloseHandle(hFile);
       }
       else
       {
          dwRet = ::GetLastError();
       }
       return dwRet; // NO_ERROR if succeeded
    }

  3. FindFirstFile
    Vezi postul precedent.

Resurse


<< Back to Windows API Index
Avatar utilizator
Ovidiu Cucu
Fondator
Fondator
 
Mesaje: 3772
Membru din: 11 Iul 2007, 16:10
Localitate: Iasi
Judet: Iaşi

Re: [WinAPI] Cum aflu dimensiunea unui fisier?

Mesajde mesajflaviu » 12 Feb 2014, 14:49

O alta metoda de a afla dimensiunea unui fisier fara a-l deschide, este folosind metoda CFile::GetStatus, versiunea statica.
Exemplu:
Cod: Selectaţi tot
   CString sPath(_T("D:\\Temp\\myfile.txt"));
   CFileStatus status;
   CFile::GetStatus(sPath, status);
   ULONGLONG dwFileSize = status.m_size;

Mai mult, cu ajutorul acestei metode putem afla pe langa marimea fisierului, informatii cu privire la data crearii/modificarii/accesarii, precum si atributele fisierului.
Ultima oară modificat de Marius Bancila pe 06 Mar 2014, 17:37, modificat 1 dată în total.
Motiv: m_size e de tip ULONGLONG nu DWORD
mesajflaviu
Membru++
Membru++
 
Mesaje: 674
Membru din: 10 Sep 2008, 21:40
Judet: Cluj


Înapoi la Windows API

Cine este conectat

Utilizatorii ce navighează pe acest forum: Google [Bot] şi 3 vizitatori

cron