微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DeleteFile失败,但文件在那里非常长的文件名

我正在写一个错误的备份程序。 用debugging程序遍历代码,我发现删除文件时出现错误

我使用CFileFind来查找文件,并使用CFileFind::GetFilePath()来获取完整的path名。

CFileFind find; BOOL bContinue = find.FindFile(Appendpath(lpszPath,_T("*"))); while (bContinue) { bContinue = find.FindNextFile(); if (!find.IsDirectory()) { if (find.IsReadOnly()) ClearReadOnlyAttribute(find); if (!::DeleteFile(find.GetFilePath())) return false; } }

DeleteFile()返回FALSE , GetLastError()返回3( ERROR_PATH_NOT_FOUND ),并在其他情况下返回2( ERROR_FILE_NOT_FOUND )。

正如你所看到的,我首先尝试删除只读属性,如果它被设置; 但是,我可以看到该文件存在,它不具有只读属性

如何删除一个文件,使删除是不可撤销的?

这个记事本(.bat)代码是做什么的,它是如何工作的?

强制删除文件。 Python,Windows

使用batch file或命令删除只读文件

Python脚本不能删除Windows中的Git文件

有一点要注意的是,文件名非常长。 这段代码实际上已经过testing,并且工作得很好,文件名较短。 在这种情况下, find.GetFilePath()返回:

\ Readieshare USB3 Backups DRIVEZ_BACKUP Stacey Backup 0001 Music TO DELETED iTunes iTunes Media Music Dave Matthews乐队远离世界(豪华版)远离世界(豪华版。 itlp audio DaveMatthewsBand_AwayFromTheWorld_backgroundaudio.m4a

这看起来是正确的。 如果我将除文件名外的所有文件复制到Windows资源pipe理器中,则会显示文件夹。 该文件存在那个文件夹中。

有没有人知道为什么DeleteFile()会告诉我path或文件不存在时,实际上它呢?

更新:

基于Bruno Ferreira的回答,我正在通过以下方法运行我的文件名。 (对不起旧的CString风格的代码,我正在更新一个旧的MFC程序。)

CString CBackupWorker::ConvertToExtendedLengthPath(LPCTSTR pszPath) { CString s(pszPath); if (s.GetLength() >= MAX_PATH) { if (::isalpha(s[0]) && s[1] == ':') { s.Insert(0,_T("\\?\")); } else if (s[0] == '\' && s[1] == '\') { s.Delete(0,2); s.Insert(0,_T("\\?\UNC\")); } } return s; }

正如你所看到的代码,如果文件名超过MAX_PATH ,则预先设置适当的前缀。 根据path是否指定networkingpath,采取步骤追加适当的前缀。

我不知道为什么这是令人难以置信的混乱。 如果Windows允许您指定更长的名称,我真的不会看到向后兼容性问题。 在Windows 10中,有一个registry设置可以更改,这样就不需要这个废话了。 但是,当然,我不想将我的软件限制为仅针对Windows 10进行调整的版本。

找不到文件通过git bash删除,但它显示文件资源pipe理器

删除所有设置为隐藏或只读或系统的文件

删除包含大量文件文件夹,并显示正在删除文件

这个bash脚本有多危险?

删除项目不删除文件

来自MSDN :

参数

lpFileName [in]要删除文件名称。 在该函数的ANSI版本中,名称被限制为MAX_PATH个字符。 要将此限制扩展为32,767个宽字符,请调用函数的Unicode版本,并将“\?”添加到路径中。 有关更多信息,请参阅命名文件

基本上,你应该调用DeleteFileW在本地路径上加上\?UNC为远程路径加上\?UNC ,如下所示:

CFileFind find; BOOL bContinue = find.FindFile(Appendpath(lpszPath,_T("*"))); while (bContinue) { bContinue = find.FindNextFile(); if (!find.IsDirectory()) { if (find.IsReadOnly()) ClearReadOnlyAttribute(find); CString path = find.GetFilePath(); if (path.GetLength() >= MAX_PATH) { if (PathIsUNC(path)) { path.TrimLeft(_T("\")); path.Insert(0,_T("\\?\UNC\")); } else path.Insert(0,_T("\\?\")); } if (!::DeleteFileW(path)) return false; } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐