如何修复 CopyFile() 错误 5 - 访问被拒绝错误
How to fix CopyFile() error 5 - access denied error
我正在尝试编写一个可以在Linux和Windows上使用的复制文件函数。它适用于Linux,但在Windows上,我在尝试使用WinApi函数CopyFile((时收到错误代码5。
在头文件.h 中
这是 File 命名空间中的自定义函数,我应该能够在 Linux 和 Windows 上使用。
class File
{
public:
static bool copyFile(std::string source, std::string destination);
private:
}
在文件中.cpp
对于Linux来说,这很简单:
#ifdef __unix__
#include "File.h"
bool File::copyFile(std::string source, std::string destination)
{
std::string arg = source + " " + destination;
return launchProcess("cp", arg);
}
#endif
在Windows特定的代码块中,我使用WinAPI(#include
#ifdef _WIN32
#include "File.h"
#include <Windows.h>
std::wstring strtowstr(const std::string &str)
{
// Convert an ASCII string to a Unicode String
std::wstring wstrTo;
wchar_t *wszTo = new wchar_t[str.length() + 1];
wszTo[str.size()] = L' ';
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, wszTo,(int)str.length());
wstrTo = wszTo;
delete[] wszTo;
return wstrTo;
}
bool File::copyFile(std::string source, std::string destination)
{
std::wstring wsource = strtowstr(source);
std::wstring wdestination = strtowstr(destination);
int result = CopyFileW(wsource.c_str(), wdestination.c_str(), TRUE);
//for debugging...
std::wcout << "The error is " << GetLastError() <<std::endl;
std::wcout << wsource.c_str() << std::endl;
std::wcout << wdestination.c_str() << std::endl;
if (result == 0)
{
return false;
}
return true;
}
#endif
在我的测试程序中
TEST(all,main_copy_file)
{
std::cout << "Testing copyFile() function..." << std::endl;
std::string srcDir = File::currentWorkingDirectory() + "srcDir";
File::makeDirectory(srcDir);
std::string destDir = File::currentWorkingDirectory() + "destDir/";
File::makeDirectory(destDir);
File::makeFile(srcDir, "testFile", ".txt");
ASSERT_TRUE(File::fileExists(srcDir + "/testFile.txt")) << "Error: Test file has not been generated" << std::endl;
ASSERT_TRUE(File::directoryExists(destDir)) << "Error: Destination directory does not exist" <<std::endl;
ASSERT_TRUE(File::copyFile(srcDir + "/testFile.txt", destDir)) << "Error: Coppy unsucsessfull" << std::endl;
ASSERT_TRUE(File::fileExists(destDir + "/testFile.txt")) << "Error: CoppyFile() flagged as sucsessfull but file does not exist" << std::endl;
}
在应用程序中 输出 (在 Windows 上(
/*
Testing copyFile() function...
The error is 5
C:GITCorteXExternalsOSALbuildDebug/srcDir/testFile.txt
C:GITCorteXExternalsOSALbuildDebug/destDir/
error: Value of: File::copyFile(srcDir + "/testFile.txt", destDir)
Actual: false
Expected: true
Error: Coppy unsucsessfull
*/
错误代码 5 是拒绝访问错误。我认为当目录不存在、目录在其他地方打开或我没有权限时,它会给出此错误。
由于我已经测试了该目录确实存在,因此我认为它一定是后两个之一。我可能只有有限的管理员权限(我不知道(,但我可以在没有管理员许可的情况下粘贴到"destDir"中。所以也许它认为目录是开放的?是否存在确保目录已关闭的命令?
在 Linux 上运行时,测试是成功的。
CopyFile API 需要源文件和目标文件的文件名。代码传递目标的目录名称。这会导致 API 失败。您还需要附加目标的文件名。
除此之外,您的代码还有其他几个问题:
- Windows 上的路径分隔符是反斜杠 (
(。您正在混合正斜杠 (
/
( 和反斜杠。根据传递的参数,系统不会将正斜杠转换为反斜杠,然后再将它们传递给较低级别的文件 I/O API。 - 你打电话
GetLastError
太晚了。每当记录它以返回有意义的值时,都需要立即调用它。不要将它与任何其他代码穿插在一起,无论它对您来说多么微不足道。该代码可以修改调用线程的最后一个错误代码并使其无效。 - 代码假定使用 ASCII 编码的字符串。在处理包含非 ASCII 字符的文件时,这将停止工作。这是很常见的。
new wchar_t[...]
不会给你买到超过std::vector<wchar_t>
的东西,除了引入错误的可能性。- 基于 MultiByteToWideChar 的字符串转换实现对不同字符编码的代码单元要求做出(不必要的(假设。这些假设可能不正确。让 API 计算并告诉您目标缓冲区大小,方法是为cchWideChar传递
0
。 - 字符串转换例程会忽略所有返回值,从而使错误变得如此之大,并且不必要地难以诊断。
我知道这是一篇旧帖子,但对于任何在这里跌跌撞撞需要更多帮助的人:
CopyFile 具有以下约束,如果不满足这些约束,可能会导致访问被拒绝错误:
- 当前用户的权限不足
- 文件正在使用中 文件
- 路径是目录而不是文件
- 文件是只读的
就我而言,上述所有内容都得到了满足,但我仍然不断收到相同的错误。帮助我的是一个简单的SetFileAttributes(filePath,FILE_ATTRIBUTE_NORMAL)
检索和更改文件属性
设置文件属性
- 尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误
- C++ - 循环访问指针数组会导致错误
- 执行错误访问 遍历向量
- 错误访问 读入对象后
- 如何修复 CopyFile() 错误 5 - 访问被拒绝错误
- CreateFile 在尝试打开目录进行读取时始终返回错误 5(访问被拒绝)
- 范围检查检测到的检测代码和超出范围的错误访问
- 查找() 上的 C++ 错误访问错误
- 错误访问另一个插件中的类(错误:未定义的引用)
- C STD ::排序Intel编译器错误:访问违规
- libcurl、OSX、curl_multi_执行错误访问
- C++数组错误:访问冲突读取位置0xC0000005
- C++LinkedList错误:访问冲突错误
- 使用.open()成员函数C++的ifstream数组的错误访问代码
- C++ 段错误 访问对象指针向量的 std::vector.size()
- JNI 从 C 错误访问对象数组
- 带有内存错误访问的C++结构new
- XCode C++上的错误访问错误
- 错误访问冲突写入位置0x00229C20.尝试在控制台中输入字符串时
- MySQL 连接器/C++ 错误访问崩溃