使用SHFileOperation按日期删除文件和文件夹

时间:2011-10-15 14:50:13

标签: c windows winapi windows-shell

我正在尝试使用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会以某种方式使文件句柄无效(或者至少我认为如此)。我能想到的唯一解决方案是保存匹配文件/文件夹的名称并逐个删除它们。还有其他更简单的解决方案吗?

由于

2 个答案:

答案 0 :(得分:2)

    FindNextFile( hFind, &findFileData );
    errorCode = GetLastError();

那是错的。当您从FindNextFile()获得FALSE返回时,调用GetLastError()。修正:

    if (!FindNextFile( hFind, &findFileData ) {
        errorCode = GetLastError();
    }

答案 1 :(得分:1)

当函数成功时,不会设置线程的最后一个错误代码。您必须检查GetLastError的返回值。

,而不是调用FindNextFile
  

如果函数成功,则返回值为非零,lpFindFileData参数包含有关找到的下一个文件或目录的信息。

     

如果函数失败,返回值为零,lpFindFileData的内容不确定。

FindNextFile function

循环应如下所示:

HANDLE handle(FindFirstFile(...));
if (handle != INVALID_HANDLE_VALUE)
{
    do
    {
        // filter files here
    }
    while (FindNextFile(handle, ...));
    FindClose(handle);
}