VC++实现获取文件占用空间大小的两种方法(非文件大小)

 1 // GetFileSpaceSize.cpp : Defines the entry point for the console application.
 2 //
 3 /************************************************************************
 4  * author: HwangBae
 5  * created:    2012/07/21
 6  * Blog: http://hwangbae.cnblogs.com/
 7  * Email: hwangbae@live.cn
 8  ************************************************************************/
 9 
10 #include <windows.h>
11 #include <tchar.h>
12 #include <stdio.h>
13 #include <math.h>
14 
15 
16 int _tmain(int argc, _TCHAR* argv[])
17 {
18     if (argc < 2)
19     {
20         _tprintf_s(_T("Usage: GetFileSpaceSize filename
"));
21         return -1;
22     }
23 
24     // 文件路径
25     LPCTSTR szFileName = argv[1];
26 
27     // 打开文件句柄
28     HANDLE hFile = ::CreateFile(szFileName, GENERIC_READ | FILE_SHARE_READ, 0, 
29         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
30     if (hFile == INVALID_HANDLE_VALUE)
31     {
32         _tprintf_s(_T("Failed to create file handle: %s ! error code:%d
"), szFileName, GetLastError());
33         return -1;
34     }
35 
36     // 获取文件大小
37     UINT64 uFileSize = 0;
38     ::GetFileSizeEx(hFile, reinterpret_cast<PLARGE_INTEGER>(&uFileSize));
39     ::CloseHandle(hFile);
40 
41     // 获取磁盘根路径
42     TCHAR szVolumePathName[] = _T("C:\");
43     ::GetVolumePathName(szFileName, szVolumePathName, sizeof(szVolumePathName) / sizeof(TCHAR));
44 
45     // 保存簇信息的变量
46     DWORD dwSectorsPerCluster = 0;
47     DWORD dwBytesPerSector = 0;
48     DWORD dwNumberOfFreeClusters = 0;
49     DWORD dwTotalNumberOfClusters = 0;
50 
51     // 获取簇信息
52     if (!::GetDiskFreeSpace(
53             szVolumePathName,            //磁盘根路径
54             &dwSectorsPerCluster,        //每簇的扇区数
55             &dwBytesPerSector,            //每扇区的字节数
56             &dwNumberOfFreeClusters,    //空余簇的数量
57             &dwTotalNumberOfClusters    //全部簇的数量
58             )
59         )
60     {
61         _tprintf_s(_T("Failed to get disk cluster info! error code: %d
"), GetLastError());
62         return -1;
63     }
64     // 簇大小 = 每簇的扇区数 * 每扇区的字节数
65     DWORD dwClusterSize = dwSectorsPerCluster * dwBytesPerSector;
66 
67     // 计算文件占用空间
68     // 公式:(以字节为单位)
69     // 簇数 = 向上取整(文件大小 / 簇大小)
70     // 占用空间 = 簇数 * 簇大小
71     UINT64 dwFileSpacesize = static_cast<UINT64>(ceil(uFileSize / static_cast<double>(dwClusterSize)) * dwClusterSize);
72 
73     _tprintf_s(_T("FileName : %s
"), szFileName);
74     _tprintf_s(_T("FileSize : %I64u Byte
"), uFileSize);
75     _tprintf_s(_T("FileSpacesSize : %I64u Byte
"), dwFileSpacesize);
76     return 0;
77 }

方法二:

 1 // GetFileSpaceSize.cpp : Defines the entry point for the console application.
 2  //
 3  /************************************************************************
 4   * author: HwangBae
 5   * created:    2012/07/23
 6   * Blog: http://hwangbae.cnblogs.com/
 7   * Email: hwangbae@live.cn
 8   ************************************************************************/
 9  
10  #include <windows.h>
11  #include <tchar.h>
12  #include <stdio.h>
13  
14  #define CLOSE_HANDLE(handle) 
15      do 
16      { 
17          CloseHandle(handle); 
18          handle = NULL; 
19      } while (FALSE)
20  
21  int _tmain(int argc, _TCHAR* argv[])
22  {
23      if (argc < 2)
24      {
25          _tprintf_s(_T("Usage: GetFileSpaceSize filename
"));
26          return -1;
27      }
28  
29      // 文件路径
30      LPCTSTR szFileName = argv[1];
31  
32      // 打开文件句柄
33      HANDLE hFile = ::CreateFile(szFileName, GENERIC_READ | FILE_SHARE_READ, 0, 
34          NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
35      if (hFile == INVALID_HANDLE_VALUE)
36      {
37          _tprintf_s(_T("Failed to create file handle: %s ! error code:%d
"), szFileName, GetLastError());
38          return -1;
39      }
40  
41      // 获取文件大小
42      UINT64 uFileSize = 0;
43      ::GetFileSizeEx(hFile, reinterpret_cast<PLARGE_INTEGER>(&uFileSize));
44  
45      FILE_STANDARD_INFO fsi = {0};
46      if (!::GetFileInformationByHandleEx(hFile, FileStandardInfo, &fsi, sizeof(FILE_STANDARD_INFO)))
47      {
48          _tprintf_s(_T("Failed to get file info! error code:%d
"), GetLastError());
49          CLOSE_HANDLE(hFile);
50          return -1;
51      }
52  
53      _tprintf_s(_T("FileName : %s
"), szFileName);
54      _tprintf_s(_T("FileSize : %I64u Byte
"), uFileSize);
55      _tprintf_s(_T("FileSpacesSize : %I64u Byte
"), fsi.AllocationSize);
56      CLOSE_HANDLE(hFile);
57      return 0;
58  }

转载:http://www.cnblogs.com/hwangbae/archive/2012/07/21/2602592.html

原文地址:https://www.cnblogs.com/chechen/p/5138709.html