我正在尝试使用windows API编写一个程序,根据日期删除一组与特定命名模式(通配符)匹配的文件/文件夹
...
SHFILEOPSTRUCT shFileOpStruct = {
.hwnd = NULL,
.wFunc = processByDate->op,
.pTo = NULL,
.fFlags = FOF_NOCONFIRMATION | FOF_SILENT
};
buildReferenceDate( &refTime, processByDate->nDays );
hFind = FindFirstFile( processByDate->srcFileName, &findFileData );
errorCode = GetLastError();
while ( errorCode == ERROR_SUCCESS ) {
LONG res = CompareFileTime( &refTime, &findFileData.ftCreationTime );
if ( (processByDate->nDays ^ res) > 0 ) {
sprintf( strrchr(processByDate->srcFileName, '\\') + 1, "%s%c",
findFileData.cFileName, '\0');
shFileOpStruct.pFrom = processByDate->srcFileName;
fprintf( stdout, "\n%s\n", shFileOpStruct.pFrom);
fprintf( stdout, "\n0x%x\n", SHFileOperation( &shFileOpStruct ));
}
FindNextFile( hFind, &findFileData );
errorCode = GetLastError();
}
if ( errorCode != ERROR_NO_MORE_FILES )
displayError ( stdout, errorCode );
...
仅删除第一个匹配的文件,因为FindNextFile以“句柄无效”终止。显然,SHFileOperation会以某种方式使文件句柄无效(或者至少我认为如此)。我能想到的唯一解决方案是保存匹配文件/文件夹的名称并逐个删除它们。还有其他更简单的解决方案吗?
由于
答案 0 :(得分:2)
FindNextFile( hFind, &findFileData );
errorCode = GetLastError();
那是错的。当您从FindNextFile()获得FALSE返回时,仅调用GetLastError()。修正:
if (!FindNextFile( hFind, &findFileData ) {
errorCode = GetLastError();
}
答案 1 :(得分:1)
当函数成功时,不会设置线程的最后一个错误代码。您必须检查GetLastError
的返回值。
FindNextFile
如果函数成功,则返回值为非零,lpFindFileData参数包含有关找到的下一个文件或目录的信息。
如果函数失败,返回值为零,lpFindFileData的内容不确定。
循环应如下所示:
HANDLE handle(FindFirstFile(...));
if (handle != INVALID_HANDLE_VALUE)
{
do
{
// filter files here
}
while (FindNextFile(handle, ...));
FindClose(handle);
}