Удалите файлы и папки по дате, используя SHFileOperation - PullRequest
0 голосов
/ 15 октября 2011

Я пытаюсь написать программу, которая будет удалять набор файлов / папок, которые соответствуют определенному шаблону именования (подстановочные знаки) на основе их дат, используя 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 ]

2 голосов
/ 15 октября 2011
    FindNextFile( hFind, &findFileData );
    errorCode = GetLastError();

Это неправильно. Только вызывает GetLastError (), когда вы получаете ЛОЖНЫЙ возврат из FindNextFile (). Исправлено:

    if (!FindNextFile( hFind, &findFileData ) {
        errorCode = GetLastError();
    }
1 голос
/ 15 октября 2011

Последний код ошибки потока не устанавливается при успешном выполнении функции.Вместо вызова GetLastError необходимо проверить возвращаемое значение FindNextFile.

Если функция завершается успешно, возвращаемое значение не равно нулю, а параметр lpFindFileData содержит информацию о следующем файле или каталогенайдено.

В случае сбоя функции возвращаемое значение равно нулю, а содержимое lpFindFileData является неопределенным.

Функция FindNextFile

Цикл должен выглядеть так:

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