Folosire Windows API in programe C/C++ (forum moderat)
Silviu Ardelean
Senior
Posts: 1175 Joined: 12 Jul 2007, 09:22
Contact:
Post
by Silviu Ardelean » 25 Nov 2010, 18:05
Intrebare : Cum aflu dimensiunea unui fisier?
Raspuns : O metoda este folosind functia FindFirstFile.
Exemplu
Code: Select all
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:
Last edited by
Ovidiu Cucu on 27 Nov 2010, 20:04, edited 2 times in total.
Reason: few cosmetics
Ovidiu Cucu
Fondator
Posts: 3778 Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:
Post
by Ovidiu Cucu » 18 Jul 2011, 13:50
Raspuns
Pentru aflarea dimensiunii unui fisier se pot utiliza urmatoarele functii WinAPI:
GetFileSize
Exemplu
Code: Select all
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
}
GetFileSizeEx
Exemplu
Code: Select all
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
}
FindFirstFile
Vezi postul precedent .
Resurse
<< Back to Windows API Index
mesajflaviu
Membru++
Posts: 687 Joined: 10 Sep 2008, 21:40
Judet: Cluj
Post
by 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:
Code: Select all
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.
Last edited by
Marius Bancila on 06 Mar 2014, 17:37, edited 1 time in total.
Reason: m_size e de tip ULONGLONG nu DWORD