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实现的源代码,以便允许我进一步跟踪该错误,请将其作为注释发布)

调试器的图片

enter image description here

完整代码实现:

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;
}

出局: enter image description here

因此,我认为在其他位置打开手柄后,您没有正确关闭它。如果需要在打开句柄的同时复制文件,则可以将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;
}

输出:

enter image description here

更多参考:CreateFileWCopyFileExA