调用 std::filesystem::copy() 时可能会返回哪些错误代码?
What are the possible error codes that can be returned when calling std::filesystem::copy()?
我似乎找不到可能传递到 std::filesystem::copy
的 ec
参数的错误代码列表。
cppreference.com 似乎表明错误代码是 OS 特定的。
查看 the Microsoft documentation(因为我对 Windows 错误代码,尽管我确信其他 OSes 的资源会对其他人有所帮助)它看起来几乎像 copy/paste 相同的源文档,没有关于任何内容的任何附加信息 Windows 具体。
我的猜测是错误代码将与 here 中列出的相同,但没有关于哪些与文件系统相关的信息,或者更具体地说是 copy()
函数(超出有根据的猜测)。
有没有人有关于可能返回的潜在错误代码的任何资源,或者,如果我必须以困难的方式执行此操作(并手动尝试检查不同的错误情况),我怎么知道我是否有一份详尽的清单?
文件系统库使用的系统特定错误代码可以是found in the __std_win_error
enum. Note how the numerical values map 1:1 to the values returned by the Win32 API function GetLastError
:
enum class __std_win_error : unsigned long {
_Success = 0, // #define ERROR_SUCCESS 0L
_Invalid_function = 1, // #define ERROR_INVALID_FUNCTION 1L
_File_not_found = 2, // #define ERROR_FILE_NOT_FOUND 2L
_Path_not_found = 3, // #define ERROR_PATH_NOT_FOUND 3L
_Access_denied = 5, // #define ERROR_ACCESS_DENIED 5L
_Not_enough_memory = 8, // #define ERROR_NOT_ENOUGH_MEMORY 8L
_No_more_files = 18, // #define ERROR_NO_MORE_FILES 18L
_Sharing_violation = 32, // #define ERROR_SHARING_VIOLATION 32L
_Not_supported = 50, // #define ERROR_NOT_SUPPORTED 50L
_File_exists = 80, // #define ERROR_FILE_EXISTS 80L
_Invalid_parameter = 87, // #define ERROR_INVALID_PARAMETER 87L
_Insufficient_buffer = 122, // #define ERROR_INSUFFICIENT_BUFFER 122L
_Invalid_name = 123, // #define ERROR_INVALID_NAME 123L
_Directory_not_empty = 145, // #define ERROR_DIR_NOT_EMPTY 145L
_Already_exists = 183, // #define ERROR_ALREADY_EXISTS 183L
_Filename_exceeds_range = 206, // #define ERROR_FILENAME_EXCED_RANGE 206L
_Directory_name_is_invalid = 267, // #define ERROR_DIRECTORY 267L
_Max = ~0UL // sentinel not used by Win32
};
但是,您应该不直接针对这些进行测试。 system_error
设计的重点是不必直接解释系统特定的 error_code
,而是仅通过其关联的 error_category
.
来解释它们
特别是,类别将 error_code
值映射到 error_condition
s。该实现抛出 error_code
,但客户端应用程序应始终检查 error_condition
。与 error_code
不同,error_condition
是可移植的,不依赖于实现细节。
因此,您应该如何处理代码中的这些类型的错误:检查 std::errc
中您希望以编程方式处理的值。然后根据这些值检查 error_code
:
std::error_code ec;
std::filesystem::copy("source.txt", "destination.txt", ec);
if (ec) {
if (ec == std::errc::file_exists) {
// special error handling for file_exists
// [...]
} else {
// generic error handling for all other errors
// that you don't specifically care about
std::cerr << "Error: " << ec.message() << "\n";
}
}
可能会遗留一些错误,但由于您几乎肯定无法为这些错误提供专门的错误处理程序,只需为所有错误情况放入一个通用的错误处理程序你不关心的。
Chris Kohlhoff 是系统错误库的原作者之一,他对错误处理机制的设计和预期用途做了很好的解释,虽然有些过时了。
我似乎找不到可能传递到 std::filesystem::copy
的 ec
参数的错误代码列表。
cppreference.com 似乎表明错误代码是 OS 特定的。
查看 the Microsoft documentation(因为我对 Windows 错误代码,尽管我确信其他 OSes 的资源会对其他人有所帮助)它看起来几乎像 copy/paste 相同的源文档,没有关于任何内容的任何附加信息 Windows 具体。
我的猜测是错误代码将与 here 中列出的相同,但没有关于哪些与文件系统相关的信息,或者更具体地说是 copy()
函数(超出有根据的猜测)。
有没有人有关于可能返回的潜在错误代码的任何资源,或者,如果我必须以困难的方式执行此操作(并手动尝试检查不同的错误情况),我怎么知道我是否有一份详尽的清单?
文件系统库使用的系统特定错误代码可以是found in the __std_win_error
enum. Note how the numerical values map 1:1 to the values returned by the Win32 API function GetLastError
:
enum class __std_win_error : unsigned long {
_Success = 0, // #define ERROR_SUCCESS 0L
_Invalid_function = 1, // #define ERROR_INVALID_FUNCTION 1L
_File_not_found = 2, // #define ERROR_FILE_NOT_FOUND 2L
_Path_not_found = 3, // #define ERROR_PATH_NOT_FOUND 3L
_Access_denied = 5, // #define ERROR_ACCESS_DENIED 5L
_Not_enough_memory = 8, // #define ERROR_NOT_ENOUGH_MEMORY 8L
_No_more_files = 18, // #define ERROR_NO_MORE_FILES 18L
_Sharing_violation = 32, // #define ERROR_SHARING_VIOLATION 32L
_Not_supported = 50, // #define ERROR_NOT_SUPPORTED 50L
_File_exists = 80, // #define ERROR_FILE_EXISTS 80L
_Invalid_parameter = 87, // #define ERROR_INVALID_PARAMETER 87L
_Insufficient_buffer = 122, // #define ERROR_INSUFFICIENT_BUFFER 122L
_Invalid_name = 123, // #define ERROR_INVALID_NAME 123L
_Directory_not_empty = 145, // #define ERROR_DIR_NOT_EMPTY 145L
_Already_exists = 183, // #define ERROR_ALREADY_EXISTS 183L
_Filename_exceeds_range = 206, // #define ERROR_FILENAME_EXCED_RANGE 206L
_Directory_name_is_invalid = 267, // #define ERROR_DIRECTORY 267L
_Max = ~0UL // sentinel not used by Win32
};
但是,您应该不直接针对这些进行测试。 system_error
设计的重点是不必直接解释系统特定的 error_code
,而是仅通过其关联的 error_category
.
特别是,类别将 error_code
值映射到 error_condition
s。该实现抛出 error_code
,但客户端应用程序应始终检查 error_condition
。与 error_code
不同,error_condition
是可移植的,不依赖于实现细节。
因此,您应该如何处理代码中的这些类型的错误:检查 std::errc
中您希望以编程方式处理的值。然后根据这些值检查 error_code
:
std::error_code ec;
std::filesystem::copy("source.txt", "destination.txt", ec);
if (ec) {
if (ec == std::errc::file_exists) {
// special error handling for file_exists
// [...]
} else {
// generic error handling for all other errors
// that you don't specifically care about
std::cerr << "Error: " << ec.message() << "\n";
}
}
可能会遗留一些错误,但由于您几乎肯定无法为这些错误提供专门的错误处理程序,只需为所有错误情况放入一个通用的错误处理程序你不关心的。
Chris Kohlhoff 是系统错误库的原作者之一,他对错误处理机制的设计和预期用途做了很好的解释,虽然有些过时了。