DeleteFile che iniziano con substring

voglio cancellare tutti i file che iniziano con substring.

  CString Formatter = _T("C:\\logs\\test\\test_12-12-2018_1*.*");     
  DeleteFile(Formatter);

ho intenzione di eliminare i seguenti file con codice sopra

    C:\logs\test\test_12-12-2018_1_G1.txt
    C:\logs\test\test_12-12-2018_1_G2.txt
    C:\logs\test\test_12-12-2018_1_G3.txt
    C:\logs\test\test_12-12-2018_1_G4.txt

quando controllo errore da GetLastError, ottengo ERROR _ INVALID _ NOME.

qualsiasi idea come risolvere questo problema?

EN From: DeleteFile which begin with substring

More similar articles:

2 Comments

  1. DeleteFile non prende caratteri jolly. sembra che ciò di cui avete bisogno sia un FindFirstFile / FindNextFile / FindClose loop per trasformare il vostro carattere jolly in un elenco di nomi di file completi.

    #include <windows.h>
    #include <pathcch.h>
    #pragma comment(lib, "pathcch.lib")
    
    // (In a function now)
    WIN32_FIND_DATAW wfd;
    WCHAR wszPattern[MAX_PATH];
    HANDLE hFind;
    INT nDeleted = 0;
    PathCchCombine(wszPattern, MAX_PATH, L"C:\\Logs\\Test", L"test_12-12-2018_1*.*");
    SetCurrentDirectoryW(L"C:\\Logs\\Test");
    
    hFind = FindFirstFileW(wszPattern, &wfd);
    if(hFind == INVALID_HANDLE_VALUE)
    {
        // Handle error & exit
    }
    do
    {
        DeleteFileW(wfd.cFileName);
        nDeleted++;
    } 
    while (FindNextFileW(hFind, &wfd));
    FindClose(hFind);
    
    wprintf(L"Deleted %d files.\n", nDeleted);

    si noti che PathCchCombine, FindFirstFileW, e DeleteFileW possono tutti fallire, e codice robusto controllerebbe i loro valori di ritorno e gestire errori in modo appropriato. inoltre, se FindNextFileW restituisce 0 e l’ultimo codice di errore non è ERROR_NO_MORE_FILES, allora non è riuscito a causa di un errore reale (non perché non c’era nulla da trovare), e che deve essere gestito anche.

    inoltre, se la velocità è una tua preoccupazione (il tuo esempio nel tuo post sull’eliminazione di quattro file nella stessa directory non sembra come ne ha bisogno), sostituire la linea hFind = FindFirstFileW(...) con:

    hFind = FindFirstFileExW(wszPattern, FindExInfoBasic, (LPVOID)&wfd, FindExSearchNameMatch, NULL, FIND_FIRST_EX_LARGE_FETCH);
  2. anche se è possibile cercare i nomi dei file, e poi chiamare DeleteFile singolarmente per ciascuno, il mio consiglio sarebbe quello di utilizzare una delle funzioni della shell di Windows per fare il lavoro, invece.

    per esempio, si potrebbe usare codice qualcosa di simile a questo:

    #define _WIN32_IE 0x500
    
    #include <windows.h>
    #include <shellapi.h>
    #include <shlobj.h>
    #include <iostream>
    #include <string>
    
    static char const *full_path(std::string const &p) {
        static char path[MAX_PATH+2] = {0};
        char *ignore;
        GetFullPathName(p.c_str(), sizeof(path), path, &ignore);
        return path;
    }
    
    static int shell_delete(std::string const &name) {
        SHFILEOPSTRUCT op = { 0 };
    
        op.wFunc = FO_DELETE;
        op.pFrom = full_path(name);
        op.fFlags = FOF_ALLOWUNDO | FOF_SILENT | FOF_WANTNUKEWARNING | FOF_NOCONFIRMATION;
        return !SHFileOperation(&op);
    }
    
    int main(int argc, char **argv) {
    
        if ( argc < 2) {
            fprintf(stderr, "Usage: delete <filename> [filename ...]");
            return 1;
        }
    
        for (int i=1; i<argc; i++)
            shell_delete(argv[i]);    
    }

    un vantaggio evidente a questo è che si può passare il FOF_ALLOWUNDO bandiera (come ho nel codice di cui sopra), che sposta i file nel cestino invece di rimuoverlo in modo permanente. naturalmente, è possibile omettere tale flag se si desidera i file nuked.

    a seconda di quello che stai facendo, ci sono alcuni altri flag che potrebbero essere utili, come ad esempio FOF_FILESONLY, per eliminare solo file, non directory che potrebbero corrispondere al carattere jolly specificato, e FOF_NORECURSION per non farlo ripetere in sottodirectory.

    Microsoft considera SHFileOperation obsoleto, e ha (in Windows Vista, se la memoria serve) “sostituito” con IFileOperation. IFileOperation è un’interfaccia COM però, quindi a meno che non si sta utilizzando COM altrove nel vostro codice, le probabilità sono abbastanza buone che l’utilizzo aggiungerà una discreta quantità di lavoro in più per (almeno in questo caso) poco o nessun vantaggio reale. soprattutto si sta già utilizzando COM, tuttavia, questo potrebbe essere la pena di prendere in considerazione.

Leave a Reply

Your email address will not be published. Required fields are marked *