c++ 使用SHFile操作:发生了什么错误

cczfrluj  于 2023-02-14  发布在  其他
关注(0)|答案(4)|浏览(208)

我正在使用函数SHFileOperation()将文件发送到回收站,我得到了2个错误,我不知道他们的意思,因为使用此函数的错误代码不是GetLastError()值。
当函数SHFileOperation()失败时,返回值为0x57 (decimal 87)0x2 (decimal 2)。有人能帮我找到这些错误的定义吗(特别是当您考虑使用此函数时,错误不是GetLastError()代码的一部分)。
一些重要信息:

  • 我使用的是Windows 7(&我知道MSDN说要使用IFileOperation而不是SHFileOperation,但我想让我的应用程序向后兼容,这就是为什么我使用SHFileOperation)。如果错误发生是因为我在Windows 7上使用SHFileOperation,我可以使用什么解决方案来使其在2000及以上的所有Windows版本上工作?
  • 我已经调试了很多次了&就我所知我的SHFILEOPSTRUCT是正确的(使用了正确的标志,.pFrom是一个双空结尾的字符串).有一件事我可以肯定的是我的文件路径是正确的(指向一个真正的文件&它的格式正确).
  • 大约2/5倍的SHFileOperation()工作,这意味着它将文件发送到回收站&不返回错误

BOOL result;
 SHFILEOPSTRUCT fileStruct;
 fileStruct.hwnd = hwnd; 
 fileStruct.wFunc = FO_DELETE;
 fileStruct.pFrom = dest.c_str();
 fileStruct.fFlags = FOF_FILESONLY; // FOF_ALLOWUNDO
 fileStruct.fAnyOperationsAborted = result;

 // Call operation(delete file)
 int success = SHFileOperation( &fileStruct );

 // if delete was successful
 if ( success != 0 ) 
 {
    printf( "%s \t %X %d \n", dest.c_str(), success, success );
    cout << result << endl;

    MessageBox( hwnd, "Failed to delete file", "Error", MB_OK|MB_ICONERROR );
    return;
 }
eh57zj3b

eh57zj3b1#

如shf 301所述,错误代码87是ERROR_INVALID_PARAMETER,这可能是因为您没有初始化未使用的SHFILEOPSTRUCT字段的内容,因此它们将包含随机值,documentation表示pTo“如果不使用,则必须将其设置为NULL”;操作系统可能正在检查该字段的值,如果该值非空,则返回错误。
首先,通过执行以下任一操作将所有内容设置为零:

SHFILEOPSTRUCT fileStruct = { 0 };

SHFILEOPSTRUCT fileStruct;
ZeroMemory(&fileStruct, sizeof(SHFILEOPSTRUCT));

错误代码2为ERROR_FILE_NOT_FOUND;如果文件可能不存在,或者用户在程序尝试删除它之前已经删除了它,那么忽略这个错误代码可能是安全的。(注意,即使您在尝试删除它之前检查了文件是否存在,另一个进程也可能同时删除了它,因此您总是需要处理这个错误。)

sq1bmfud

sq1bmfud2#

这个snippit有一些严重的问题,我建议阅读SHFILEOPSTRUCT structure
1.'pFrom必须以双空结尾。我不知道dest是什么类型,但几乎可以肯定它不会返回以双空结尾的字符串。
1.如果不使用pTo参数,则必须将其设置为NULL。不允许使用通配符。使用通配符将导致不可预知的结果。
1.安全的做法是在填充结构体之前调用零内存:

SHFILEOPSTRUCT shStruct;    
ZeroMemory (&shStruct, sizeof(SHFILEOPSTRUCT));

1.文件结构.fAnyOperationsAborted =结果;won't put the value the function returns into result. The SHFILEOPSTRUCT '存在于堆栈上,可以在调用后简单地从中读取。
这些问题本身就解释了您获得的错误代码。

agxfikkp

agxfikkp3#

根据SHFileOperation文档,这些错误Map到WinError. h中的标准Windows错误代码,您可以在this page on MSDN中查找这些错误代码。
您的错误可能是:
ERROR_FILE_NOT_FOUND 2(0x2)系统找不到指定的文件。
以及
错误无效参数87(0x57)参数不正确。

inn6fuwd

inn6fuwd4#

当使用SHFileOperation处理宽字符串时,不仅需要使用double-null终止字符串,而且因为pFrom是字符串的 list,所以必须使用double-double-null终止路径字符串:
所以,在fileStruct.pFrom = dest.c_str();语句中,不能保证会给予你一个双null
您必须在分配前执行此操作:

WCHAR wszFrom[MAX_PATH] = { 0 };
StrCpyW(wszFrom, dest.c_str());
CopyMemory(wszFrom + lstrlenW(wszFrom), "\0\0", 2);

然后指定双双空字符串:

fileStruct.pFrom = wszFrom;

您可以防止出现此error

ERROR_FILE_NOT_FOUND 2 (0x2) The system cannot find the file specified.

相关问题