windows - Sådan fjerner du filen, hvis programmet ikke kører?

Indlæg af Hanne Mølgaard Plasc

Problem



Det er ikke sikkert, om det er muligt, men jeg skaber en filkodningsapplikation. Når en fil dekodes, gemmes den midlertidigt i en tempmappe, hvorefter den kan åbnes regelmæssigt. Jeg skal faktisk være sikker på filen fjernes, så snart den applikation, der har åbnet den, har lukket den (f.eks. er lukket). Ellers hænger den afkodede (hemmelige) fil bare i temp-mappen uden tilsyn.


Hvad mere er, selvom min ansøgning selv er lukket ned af en eller anden grund, vil jeg gerne overføre denne opgave til Windows, hvis det er muligt. Så lad brugeren afkode en fil og åbne den, og så min ansøgning lukkes (enten normalt eller unormalt), skal den afkodede fil i Temp-mappen stadig fjernes, så snart den ikke længere bruges.


Hvordan vil jeg gå om dette? Jeg har set tips som FileSystemWatcher og en triviel 'check hvert sekund' ide, men hvis min ansøgning ikke er i live i øjeblikket er den afkodede fil lukket, vil jeg stadig gerne have filen fjernet. Så jeg antager, at jeg behøver at overføre denne respons til Windows, men jeg er ikke sikker på, om det er muligt og i så fald hvordan.


Så hvordan fjerner jeg en fil, så snart den er lukket, hvis min ansøgning ikke kører på det pågældende tidspunkt?

Bedste reference


At gøre dette kan virke:



  1. I den proces, der opretter filen, skal du oprette den med FileOptions.DeleteOnClose, og med FileShare.ReadWrite (eller FileShare.Read, hvis kun læsadgang er nødvendig fra andre processer). Du kan også have brug for FileShare.Delete.

  2. Lad ikke filen lukke i hovedprogrammet, der oprettede det, indtil programmet forlader.

  3. I andre processer, der forbruger den midlertidige fil, skal du åbne den med de samme filindstillinger som originalen.



På denne måde vil filen blive slettet, når den sidste proces, der har filen åben, lukkes.


UPDATE:


Som bemærket i kommentarerne synes der ikke at være en måde i .NET API til at angive både FIleShare-indstillingerne og FileOptions.DeleteOnClose. Det er muligt at bruge straight Win32. Jeg har kopieret en prøve, som jeg testede nedenfor. Der er 2 programmer, en der skaber filen, en anden der bruger den. Den eneste bemærkelsesværdige forskel mellem 2 er, at forbrugeren åbner filen med OPEN\_EXISTING.


Creator



#define WIN32\_LEAN\_AND\_MEAN
#include <windows.h>
#include <iostream>
#include <string>

int \_tmain(int argc, \_TCHAR* argv[])
{
    HANDLE fh = CreateFile(
        L"yourFilePath\tempFile.dat",
        GENERIC\_READ | GENERIC\_WRITE,
        FILE\_SHARE\_WRITE|FILE\_SHARE\_READ|FILE\_SHARE\_DELETE,
        NULL,
        CREATE\_NEW,
        FILE\_FLAG\_DELETE\_ON\_CLOSE,
        NULL);
    if(fh==INVALID\_HANDLE\_VALUE)
    {
        std::cerr << "Failed to create file. Error code = " << GetLastError() << std::endl;
        return 1;
    }

    std::cout<< "Hit enter to close.";
    std::string inp;
    std::getline(std::cin,inp);

    CloseHandle(fh);


    return 0;
}


Forbruger



#define WIN32\_LEAN\_AND\_MEAN
#include <windows.h>
#include <iostream>
#include <string>

int \_tmain(int argc, \_TCHAR* argv[])
{
    HANDLE fh = CreateFile(
        L"yourFilePath\tempFile.dat",
        GENERIC\_READ | GENERIC\_WRITE,
        FILE\_SHARE\_WRITE|FILE\_SHARE\_READ|FILE\_SHARE\_DELETE,
        NULL,
        OPEN\_EXISTING,
        FILE\_FLAG\_DELETE\_ON\_CLOSE,
        NULL);
    if(fh==INVALID\_HANDLE\_VALUE)
    {
        std::cerr << "Failed to create file. Error code = " << GetLastError() << std::endl;
        return 1;
    }

    DWORD written;
    if(!WriteFile(fh,"Test",4,&written,NULL))
    {
        std::cerr << "Failed to write data to file. Error code = " << GetLastError() << std::endl;
        return 1;
    }


    std::cout<< "Hit enter to close.";
    std::string inp;
    std::getline(std::cin,inp);

    CloseHandle(fh);


    return 0;
}

Andre referencer 1


Brug FileOptions.DeleteOnClose.

Andre referencer 2


Ting som FileOptions.DeleteOnClose vil ikke hjælpe, hvis dine medier bliver utilgængelige, eller maskinen slukker, før sletningen sker. For mig ser det meget ud som en eksogen tilstand. [5]


Kan du strejke afkodningen til en hukommelses stream snarere end til disk og tage hele problemet væk.