Windows 查看文件大小

本文探讨了使用C++在Windows环境下处理大文件时遇到的错误,并提供了`sprintf_s`替换`sprintf`的解决方案。重点在于正确获取超过4GB文件大小的方法,以及更新代码示例以适应大文件操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击跳转到视频教程

代码:

#include<windows.h>
#include<tchar.h>
#include<iostream>
using namespace std;
int WINAPI _tWinMain(HINSTANCE hinstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nShowCmd) {

	HANDLE hFile = CreateFile(_T("D:\\123.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile != INVALID_HANDLE_VALUE)
	{
		// 注意由于 DWORD 占32位,所以最大只能获取到4GB文件大小,文件超过4GB,就获取的不对
		DWORD dwFileSize = GetFileSize(hFile, NULL);
		TCHAR szFileSize[128] = {0};
		_stprintf(szFileSize, _T("文件的大小是:%d"), dwFileSize);
		// 只有打开成功的时候才关闭句柄,打开失败的时候hFile不需要关闭
		CloseHandle(hFile);
		MessageBox(NULL, szFileSize, _T("tip"), MB_OK);
	}
	else
	{
		MessageBox(NULL, _T("打开文件失败"), _T("tip"), MB_OK);
	}
	return 0;
}

运行报错:

 error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

在这里插入图片描述
解决办法:
报错信息中提示我们使用这个宏
在这里插入图片描述
点击 调试 -> 属性 -> c/c++ -> 预处理器 -> 预处理器定义 -> 添加宏 -> 确定 然后重新运行
在这里插入图片描述
在这里插入图片描述
重新运行成功
在这里插入图片描述
如果文件大小超过了4GB,则获取的结果不正确
在这里插入图片描述

在这里插入图片描述
更正后的程序如下:

#include<windows.h>
#include<tchar.h>
#include<iostream>
using namespace std;
int WINAPI _tWinMain(HINSTANCE hinstance, HINSTANCE hPreInstance, LPTSTR lpCmdLine, int nShowCmd) {

	//"D:\\123.txt"

	//HANDLE hFile = CreateFile(_T("F:\\Android逆向\\YS031\\11android源码分析.rar"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	//if (hFile != INVALID_HANDLE_VALUE)
	//{
	//	// 注意由于 DWORD 占32位,所以最大只能获取到4GB文件大小,文件超过4GB,就获取的不对
	//	DWORD dwFileSize = GetFileSize(hFile, NULL);
	//	TCHAR szFileSize[128] = {0};
	//	_stprintf(szFileSize, _T("文件的大小是:%d"), dwFileSize);
	//	// 只有打开成功的时候才关闭句柄,打开失败的时候hFile不需要关闭
	//	CloseHandle(hFile);
	//	MessageBox(NULL, szFileSize, _T("tip"), MB_OK);
	//}
	//else
	//{
	//	MessageBox(NULL, _T("打开文件失败"), _T("tip"), MB_OK);
	//}


	HANDLE hFile = CreateFile(_T("F:\\Android逆向\\YS031\\11android源码分析.rar"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile != INVALID_HANDLE_VALUE)
	{
		DWORD dwFileSizeHigh = 0;
		// 注意由于 DWORD 占32位,所以最大只能获取到4GB文件大小,文件超过4GB,就获取的不对
		DWORD dwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
		LONGLONG llFileSize = (((LONGLONG)dwFileSizeHigh << 32)) | dwFileSize;
		TCHAR szFileSize[128] = { 0 };

		_stprintf(szFileSize, _T("文件的大小是:%lld"), llFileSize);
		MessageBox(NULL, szFileSize, _T("tip"), MB_OK);
		// 只有打开成功的时候才关闭句柄,打开失败的时候hFile不需要关闭
		CloseHandle(hFile);
	}
	else
	{
		MessageBox(NULL, _T("打开文件失败"), _T("tip"), MB_OK);
	}
	return 0;
}

运行结果如下,和文件实际大小一致
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值