fopen函数遇到全文件名超过260个字符怎么办 |
您所在的位置:网站首页 › linux文件名长度不得超过多少个字符 › fopen函数遇到全文件名超过260个字符怎么办 |
客户反馈程序在下载文件时一直显示失败,通过调试程序发现,原来文件下载的路径超过了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 |