fopen函数遇到全文件名超过260个字符怎么办

您所在的位置:网站首页 linux文件名长度不得超过多少个字符 fopen函数遇到全文件名超过260个字符怎么办

fopen函数遇到全文件名超过260个字符怎么办

2023-08-11 16:29| 来源: 网络整理| 查看: 265

客户反馈程序在下载文件时一直显示失败,通过调试程序发现,原来文件下载的路径超过了140,并且文件名本身也超过了120,所以全文件名超过了260个字符。

C语言库的fopen函数和MFC库的CFileStatus类的GetStatus和CFileFind类的FindFile函数都表明全文件名不能超过260个字符,我本身也进行程序测试,的确如此。

经过在Q群的咨询,得知Windows有扩展长度的方法,就是在文件名前面在\?\,如果文件名是E:\Test.txt,则变成\?\E:\Test.txt,详细内容参考 https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file

经测试,发现fopen的确成功,但GetStatus和FindFile却还是失败,调试进入源代码查看,发现这两个函数都有一个字符串长度判断,如下图所示 判断文件名的字符串长度

也就是文件名的字符串长度超过260就失败,即使在\?\也是没用,反而增加了字符串的长度。最后我用Windows的API替换了MFC库的函数。

改完之后测试,发现上面问题解决了,但又迎来了新问题,无法打开下载完后的文件所在目录,问题代码如下图所示

cstrParam.Format(_T("/select, %s"), cstrFileName); ShellExecute(NULL, _T("open"), _T("explorer.exe"), cstrParam, NULL, SW_SHOW);

因为无法调试进入ShellExecute看源码,只好猜测有字符串长度的判断,经过上网查询, 发现GetShortPathName函数可以缩短文件名,经过修改,测试后成功,代码如下

CString cstrShortPathName; int nRet = GetShortPathName(cstrFileName, cstrShortPathName.GetBuffer(1024), 1024); cstrShortPathName.ReleaseBuffer(); if(nRet != 0) { cstrParam.Format(_T("/select, %s"), cstrShortPathName); ShellExecute(NULL, _T("open"), _T("explorer.exe"), cstrParam, NULL, SW_SHOW); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3