VC++实现获取文件占用空间大小的两种方法(非文件大小)
// GetFileSpaceSize.cpp : Defines the entry point for the console application.
//
/************************************************************************
* author: HwangBae
* created: 2012/07/21
* Blog: http://hwangbae.cnblogs.com/
* Email: hwangbae@live.cn
************************************************************************/ #include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <math.h> int _tmain(int argc, _TCHAR* argv[])
{
if (argc < )
{
_tprintf_s(_T("Usage: GetFileSpaceSize filename\n"));
return -;
} // 文件路径
LPCTSTR szFileName = argv[]; // 打开文件句柄
HANDLE hFile = ::CreateFile(szFileName, GENERIC_READ | FILE_SHARE_READ, ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
_tprintf_s(_T("Failed to create file handle: %s ! error code:%d\n"), szFileName, GetLastError());
return -;
} // 获取文件大小
UINT64 uFileSize = ;
::GetFileSizeEx(hFile, reinterpret_cast<PLARGE_INTEGER>(&uFileSize));
::CloseHandle(hFile); // 获取磁盘根路径
TCHAR szVolumePathName[] = _T("C:\\");
::GetVolumePathName(szFileName, szVolumePathName, sizeof(szVolumePathName) / sizeof(TCHAR)); // 保存簇信息的变量
DWORD dwSectorsPerCluster = ;
DWORD dwBytesPerSector = ;
DWORD dwNumberOfFreeClusters = ;
DWORD dwTotalNumberOfClusters = ; // 获取簇信息
if (!::GetDiskFreeSpace(
szVolumePathName, //磁盘根路径
&dwSectorsPerCluster, //每簇的扇区数
&dwBytesPerSector, //每扇区的字节数
&dwNumberOfFreeClusters, //空余簇的数量
&dwTotalNumberOfClusters //全部簇的数量
)
)
{
_tprintf_s(_T("Failed to get disk cluster info! error code: %d\n"), GetLastError());
return -;
}
// 簇大小 = 每簇的扇区数 * 每扇区的字节数
DWORD dwClusterSize = dwSectorsPerCluster * dwBytesPerSector; // 计算文件占用空间
// 公式:(以字节为单位)
// 簇数 = 向上取整(文件大小 / 簇大小)
// 占用空间 = 簇数 * 簇大小
UINT64 dwFileSpacesize = static_cast<UINT64>(ceil(uFileSize / static_cast<double>(dwClusterSize)) * dwClusterSize); _tprintf_s(_T("FileName : %s\n"), szFileName);
_tprintf_s(_T("FileSize : %I64u Byte\n"), uFileSize);
_tprintf_s(_T("FileSpacesSize : %I64u Byte\n"), dwFileSpacesize);
return ;
}
方法二:
// GetFileSpaceSize.cpp : Defines the entry point for the console application.
//
/************************************************************************
* author: HwangBae
* created: 2012/07/23
* Blog: http://hwangbae.cnblogs.com/
* Email: hwangbae@live.cn
************************************************************************/ #include <windows.h>
#include <tchar.h>
#include <stdio.h> #define CLOSE_HANDLE(handle) \
do \
{ \
CloseHandle(handle); \
handle = NULL; \
} while (FALSE) int _tmain(int argc, _TCHAR* argv[])
{
if (argc < )
{
_tprintf_s(_T("Usage: GetFileSpaceSize filename\n"));
return -;
} // 文件路径
LPCTSTR szFileName = argv[]; // 打开文件句柄
HANDLE hFile = ::CreateFile(szFileName, GENERIC_READ | FILE_SHARE_READ, ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
_tprintf_s(_T("Failed to create file handle: %s ! error code:%d\n"), szFileName, GetLastError());
return -;
} // 获取文件大小
UINT64 uFileSize = ;
::GetFileSizeEx(hFile, reinterpret_cast<PLARGE_INTEGER>(&uFileSize)); FILE_STANDARD_INFO fsi = {};
if (!::GetFileInformationByHandleEx(hFile, FileStandardInfo, &fsi, sizeof(FILE_STANDARD_INFO)))
{
_tprintf_s(_T("Failed to get file info! error code:%d\n"), GetLastError());
CLOSE_HANDLE(hFile);
return -;
} _tprintf_s(_T("FileName : %s\n"), szFileName);
_tprintf_s(_T("FileSize : %I64u Byte\n"), uFileSize);
_tprintf_s(_T("FileSpacesSize : %I64u Byte\n"), fsi.AllocationSize);
CLOSE_HANDLE(hFile);
return ;
}
转载:http://www.cnblogs.com/hwangbae/archive/2012/07/21/2602592.html
VC++实现获取文件占用空间大小的两种方法(非文件大小)的更多相关文章
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- PHP获取文件后缀名的三种方法
如下: <? PHP获取文件后缀名的几种方法1: function get_file_type($filename){ $type = substr($filename, strrpos($fi ...
- java 获取键盘输入常用的两种方法
java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...
- PHP中获取文件扩展名的N种方法
PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法:function get_extension($file){substr(strrchr($file, '.'), ...
- QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)
QT中获取选中的radioButton的两种方法 QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioBu ...
- 使用JavaScript获取URL中的参数(两种方法)
本文给大家分享两种方法使用js获取url中的参数,其中方法二是使用的正则表达式方法,大家可以根据需要选择比较好的方法,废话不多说了,直接看详细介绍吧. 方法一: //取url参数 var type = ...
- QT中获取选中的radioButton的两种方法
QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast&l ...
- C#实现Web文件上传的两种方法
1. C#实现Web文件的上传 在Web编程中,我们常需要把一些本地文件上传到Web服务器上,上传后,用户可以通过浏览器方便地浏览这些文件,应用十分广泛. 那么使用C#如何实现文件上传的功能呢?下面笔 ...
- Java读取文件夹大小的6种方法及代码
(一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { publ ...
随机推荐
- Indexes (also called “keys” in MySQL)
High Performance MySQL, Third Edition by Baron Schwartz, Peter Zaitsev, and Vadim Tkachenko Is an ...
- c# listView中列宽随列中的内容自动调整
1.创建一个类 ListViewAutoChange 作用:自动调整ListView的列宽 代码如下:(内容很容易理解,没加注释) using System; using System.Collec ...
- Django - 补充目录
Django项目部署 importlib应用 - django contenttypes - django组件 Django - Model操作 Django - 用户认证.用户组.用户权限 Djan ...
- KVM VCPU线程调度问题的讨论
2017-11-15 今天闲着没有突然想了想VCPU线程调度的问题,具体描述如下: 当代表VCPU的线程获得控制权后,首先会通过KVM接口进入到内核,从内核进入到非根模式,那么此时站在全局调度器的点上 ...
- __getattr__,settr
__getattr__ 如果属性查找在实例以及对应的类中(通过__dict__)失败, 那么会调用到类的__getattr__函数, 如果没有定义这个函数,那么抛出AttributeError异常. ...
- navicat的安装
1.首先在官网下载navicat,具体安装步骤比较简单,下一步下一步即可. 2.安装之后,按照下面的网址做法激活 http://www.jianshu.com/p/b1f9194e1e31 3.教程: ...
- Python模块:配置文件解析器configparser
版权声明:本文为博主皮皮http://blog.csdn.net/pipisorry原创文章,未经博主同意不得转载. https://blog.csdn.net/pipisorry/article/d ...
- gradle多工程依赖
多工程依赖:http://blog.csdn.net/w8452960/article/details/53415415 https://www.cnblogs.com/softidea/p/4525 ...
- __import__ 与动态加载 python module
原文出处: koala bear Direct use of __import__() is rare, except in cases where you want to import a m ...
- hdu1181 (变形课)简单地dfs
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/F Description 呃......变形课上Harr ...