我正在写一个有错误的备份程序。 用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)代码是做什么的,它是如何工作的?
有一点要注意的是,文件名非常长。 这段代码实际上已经过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] 举报,一经查实,本站将立刻删除。