如何解决FileCopyExW报告上一个错误为ERROR_NOT_SUPPORTED-就FileCopyExW而言这意味着什么
上下文:
我需要扫描,收集信息并从特定目录复制一些媒体文件。
我一直遇到一些麻烦,无法检测到某些文件,等等
问题:
在下面的代码中,我使用c样式强制转换将this帖子中的QString
的{{1}}转换为LPCWSTR
。我尝试了许多不同的转换,但其中的一个似乎都不能正确运行-到目前为止,这还很重要。
“转换”技术带来的问题是错误ERROR_NOT_SUPPORTED
ERROR_NOT_SUPPORTED
50(0x32)
不支持该请求。
坦白说,在这种情况下,这对我来说绝对没有意义。我正在从NTFS-> NTFS(用于测试的同一硬盘驱动器)进行复制,目标文件长度小于200个字符(请参见图片,确切为192)。
核心代码:(有关详细信息,请参见底部)
CopyFileExW
此错误在 // QString src (src file location),dst (destination file location)
LPCWSTR localC_src = (LPCWSTR) src.utf16();
LPCWSTR localC_dst = (LPCWSTR) dst.utf16();
LPCWSTR dirC = (LPCWSTR) dir.utf16();
auto rc = CopyFileExW(localC_src,localC_dst,&BackupManager::copyProgress,this,&bStopBackup,0);
if (rc == 0) {
DWORD lastError = GetLastError(); // Error = 0x32
bool dirExist = DirExists(dirC); // true
bool fileExists = FileExists(localC_src); // true
printWarning(TAG,QString("File Copy Error: %1").arg(getLastErrorMsg()));
#ifdef QT_DEBUG
if (FileExists(localC_src)) {
qDebug() << "#FailedCopy: Windows file exists but copy failed" << src; // this gets hit using the implemented c-style cast
}
else {
if (QFile::exists(src)) {
qDebug() << "#FailedCopy: Windows is really being full of shit! " << src; // this always gets triggered when using QString::toStdWString.c_str()
}
else {
qDebug() << "#FailedCopy: Windows file copy failed outright" << src;
}
}
// ...
} else {
// success
}
上下文中意味着什么?
(此外,如果任何人都有windows.h实现的源代码,以便允许我进一步跟踪该错误,请将其作为注释发布)
完整代码实现:
FileCopyExW
解决方法
我建议您检查复制的文件句柄是否在另一个进程中打开。
我创建了一个简单的示例,代码如下:
#include <iostream>
#include <Windows.h>
using namespace std;
int main(int argc,const char* argv[])
{
CopyFileEx(L"D:\\test\\test.txt",L"D:\\test\\test2.txt",NULL,0);
int e = GetLastError();
cout << "error code is :" << e << endl;
return 0;
}
此示例当然可以成功复制文件。但是,如果我添加代码以打开此文件的句柄,它将返回错误代码32。
#include <iostream>
#include <Windows.h>
using namespace std;
int main(int argc,const char* argv[])
{
CreateFileW(L"D:\\test\\test.txt",GENERIC_READ | GENERIC_WRITE,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
CopyFileEx(L"D:\\test\\test.txt",0);
int e = GetLastError();
cout << "error code is :" << e << endl;
return 0;
}
因此,我认为在其他位置打开手柄后,您没有正确关闭它。如果需要在打开句柄的同时复制文件,则可以将dwShareMode
参数修改为FILE_SHARE_READ
。这样,可以在打开句柄时执行文件复制操作。
以下是示例:
#include <iostream>
#include <Windows.h>
using namespace std;
int main(int argc,FILE_SHARE_READ,0);
int e = GetLastError();
cout << "error code is :" << e << endl;
return 0;
}
输出:
更多参考:CreateFileW
和CopyFileExA
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。