// 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++实现获取文件占用空间大小的两种方法(非文件大小)的更多相关文章

  1. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  2. PHP获取文件后缀名的三种方法

    如下: <? PHP获取文件后缀名的几种方法1: function get_file_type($filename){ $type = substr($filename, strrpos($fi ...

  3. java 获取键盘输入常用的两种方法

    java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...

  4. PHP中获取文件扩展名的N种方法

    PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法:function get_extension($file){substr(strrchr($file, '.'), ...

  5. QT中获取选中的radioButton的两种方法(动态取得控件的objectName之后,对名字进行比较)

    QT中获取选中的radioButton的两种方法   QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioBu ...

  6. 使用JavaScript获取URL中的参数(两种方法)

    本文给大家分享两种方法使用js获取url中的参数,其中方法二是使用的正则表达式方法,大家可以根据需要选择比较好的方法,废话不多说了,直接看详细介绍吧. 方法一: //取url参数 var type = ...

  7. QT中获取选中的radioButton的两种方法

    QT中要获取radioButton组中被选中的那个按钮,可以采用两种如下两种办法进行: 方法一:采用对象名称进行获取 代码: 1 QRadioButton* pbtn = qobject_cast&l ...

  8. C#实现Web文件上传的两种方法

    1. C#实现Web文件的上传 在Web编程中,我们常需要把一些本地文件上传到Web服务器上,上传后,用户可以通过浏览器方便地浏览这些文件,应用十分广泛. 那么使用C#如何实现文件上传的功能呢?下面笔 ...

  9. Java读取文件夹大小的6种方法及代码

    (一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { publ ...

随机推荐

  1. 导入音乐到iPhone

    如果出现iCloud音乐资料库已打开 则需要在手机端设置:打开设置,找到音乐一栏,关闭icloud音乐资料库 http://baijiahao.baidu.com/s?id=1572411750316 ...

  2. MTU-TCP/IP协议栈-linux kernel-TCP丢包重传-UDP高性能-AI- ip数据报 tcp数据报

    1.IP协议首部 TCP报文段的首部  UDP分组结构   ip数据报 tcp数据报 UDP校验 w 报文长度该字段指定UDP报头和数据总共占用的长度.可能的最小长度是8字节,因为UDP报头已经占用了 ...

  3. 深入理解朴素贝叶斯(Naive Bayes)

    https://blog.csdn.net/li8zi8fa/article/details/76176597 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.朴素贝叶斯原理简 ...

  4. 单例模式:Qt本身就提供了专门的宏 Q_GLOBAL_STATIC 通过这个宏不但定义简单,还可以获得线程安全性

    标题起的是有点大 主要是工作和学习中,遇到些朋友,怎么说呢,代码不够Qt化 可能是由于他们一开始接触的是 Java MFC 吧 接触 Qt 7个年头了 希望我的系列文章能抛砖引玉吧 单例模式 很多人洋 ...

  5. pyqt5 主界面打开新主界面、打开Dialog、打开提示框的实现模板

    import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * ###### ...

  6. sql server dba常用概念、操作分析char,varchar,nvarchar,varchar(max)

    1.设计表时如何使用char 与 varchar? 请写出你对varchar(max)的理解. 1.设计表时如何使用char 与 varchar? 请写出你对varchar(max)的理解. char ...

  7. dedecms文章页调用地址(当前文章URL)如何操作?

    我们在建站时经常会在文末加一个本文地址,那么dedecms文章页如何调用当前文章URL呢?这样做的好处是增加文章的唯一标识,更进一步的做法是在head中加个cannacial标签,告诉搜索引擎url的 ...

  8. 流媒体ts/ps流封装/分析

    1.TS 1) 感谢星辰同学,还热乎着,

  9. linux 使用文件作为交换分区

    sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile ...

  10. [lr] 基本色调调整和色调曲线

    基本色调调整 • 曝光度调整 ▶ 控制区域 在Lightroom中,软件提示我们曝光控制的是如图中间调的区域.我们把鼠标移动到曝光工具条上,软件会提示我们这个区域: ▶ 实际效果 ▪ 增加曝光值 增加 ...