C/VC++如何打开长文件名的文件

C/VC++如何打开长文件名的文件

概述
最近本人在操作文件的时候,碰到了长文件名,即绝对路径+文件名总长度大于等于260字节,这些长文件名直接使用fopen会失败的。
本文举例描述了,怎么样成功执行长文件名fopen,从而顺利读写、创建等文件操作,满足了大部分文件操作的需要。

编译环境
VS2010

读操作

orgFileName为长文件名

FILE* OpenLongNameFileRead(char* orgFileName)
{
	FILE* pFile = NULL;
	char tmpBuf[320];
	char inFileBuf[320];
	
	if (orgFileName == NULL || strlen(orgFileName) <= 0) {
		pFile = NULL;
		goto EXIT_FUN;
	}
	if (strlen(orgFileName) < 260) {
		pFile = fopen(orgFileName, "rb");
		goto EXIT_FUN;
	}
	strcpy(tmpBuf, "\\\\?\\");
	strcat(tmpBuf, orgFileName);
	memset(inFileBuf, 0, sizeof(inFileBuf));
	/* GetShortPathName函数执行成功的前提是orgFileName文件存在,否则inFileBuf内容不会变 */
	GetShortPathName(tmpBuf, inFileBuf, sizeof(inFileBuf) - 1);
	if (strlen(inFileBuf) <= 0) {
		pFile = NULL;
		goto EXIT_FUN;
	}
	pFile = fopen(inFileBuf, "rb");
	
EXIT_FUN:
	return pFile;
}

写、创建操作

orgFileName为长文件名
FILE* OpenLongNameFileWrite(char* orgFileName)
{
	FILE* pFile = NULL;
	char inFileBuf[320];
	
	if (orgFileName == NULL || strlen(orgFileName) <= 0) {
		pFile = NULL;
		goto EXIT_FUN;
	}
	if (strlen(orgFileName) < 260) {
		pFile = fopen(orgFileName, "wb");
		goto EXIT_FUN;
	}
	strcpy(inFileBuf, "\\\\?\\");
	strcat(inFileBuf, orgFileName);
	pFile = fopen(inFileBuf, "wb");
	
EXIT_FUN:
	return pFile;
}

对于远程共享文件夹文件,操作失败,我用CMD copy命令,直接右键复制粘贴也不行,本人放弃了。
如远程文件:\10.20.31.203\subsys\BackUpDir\VcPro\putty-src-master\WINDOWS\MSVC\PSFTP\Z3GatewayHost_4\si\Host.si4project\cache\parse……_SiliconLabs_SimplicityStudio_v4_developer_sdks_gecko_sdk_suite_v2.7_platform_base_hal_micro_generic_compiler_platform-common.h.sisc
报错误如下:
在这里插入图片描述
在这里插入图片描述

小结

有了正常文件句柄指针FILE*之后,就可以像一般操作文件那样,ftell、fseek、fread、fwrite等。
本代码根据网上收集的资料和本人的探索,本代码片段经VS2010测试没有问题的。希望能够帮到各位同行。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值