问题描述
上下文:
我需要扫描,收集信息并从特定目录复制一些媒体文件。
我一直遇到一些麻烦,无法检测到某些文件,等等
问题:
在下面的代码中,我使用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