api - Få sikker temp mappe i Windows

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har brug for at få en sikker temp mappe, hvor jeg kunne gemme midlertidige filer til min ansøgning, men hidtil har min forskning fået mig til at konkludere, at alle tilgange, jeg har fundet, er fejlbehæftet.


Den første ide var at bruge GetTempPath funktionen, men det medfører to problemer:



  • Mappen eksisterer muligvis ikke, så jeg skal afkorte mapper en efter en op til rod og genskabe dem, hvis de ikke findes tilbage til den fulde sti (fejlagtigt).

  • Fra 'Larry Osterman' s WebLog 'klikker det ser ud til at GetTempPath kan falde tilbage til USERPROFILE eller Windows-mappen og udtrække mange filer her, der er SUPER BAD (TM)!



I samme indlæg er der et forslag til at bruge GetEnvironmentVariable, men dette virker som en farlig funktion for mig (mangler TMP og TEMP envvars for eksempel). [8]


Er der en renere funktion, jeg kunne bruge? Synes at SHGetKnownFolderPath har ingen anelse om, hvad temp mappe er.

Bedste reference


Dit program er sandsynligvis ikke det eneste, der stole på GetTempPath, så det er rimeligt at forvente, at det returnerer en ordentlig skrivbar sti. Især da Windows initialiserer TMP- og TEMP-miljøvariablerne automatisk for dig, ville nogen være nødt til gå nogle problemer med at tilsidesætte dem, og det ville være deres ansvar at sikre, at ændringen ikke ødelagde deres system.


Jeg vil gå videre og antage, at GetTempPath fungerer korrekt og bekymre sig om fejl, når du forsøger at oprette den midlertidige fil - der er andre fejl, der måtte opstå på det tidspunkt, som du skal kontrollere for alligevel.

Andre referencer 1


En ide ville være at få den vej, hvor din ansøgning er (GetModuleFileNameEx kombineret med GetModuleHandle(NULL) og GetCurrentProcess), da denne mappe ikke kan slettes under Windows, så længe din applikation kører fra den ( måske er jeg forkert ... for nogle år siden kunne jeg ikke gøre det :)) og i denne mappe oprette en midlertidig mappe.

Andre referencer 2


Dit første punktpunkt er løsningen. Pak det op i en metode, så du ikke kopierer kode.

Andre referencer 3


Ifølge dette svar kan Boosts Filsystem-bibliotek bruges til dette.