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测试没有问题的。希望能够帮到各位同行。