Temp dateinen automatisiert löschen
-
hi leutz
wie könnte ich das anstellen dass mein programm automatisch die temp-ordner eines rechners rauskriegt und dann den kompletten inhalt löscht (auch unterverzeichnisse). wenn ich nämlich einen fixpfad nehme funktioniert das prog nur mit einem bestimmten user namen und es kann mir auch nicht die unterverzeichnisse löschen wie mach ich dass?????
system("del C:Dokumente und Einstellungen\Username\Lokale Einstellungen\Temp\*.* /q"); // q steht für löschen ohne nachfrage
und wenn ichs so mache schreibt es mir hin "Datei konnte nicht gefunden werden"
-
system("del \"C:\Dokumente und Einstellungen\Username\Lokale Einstellungen\Temp\.\" /q");
-
das geht leider nicht so einfach, hier ist meine Version die unter Windows 2000/XP funktionieren sollte:
char szBuffer[MAX_PATH]; WIN32_FIND_DATA Fdt; HANDLE hFile; SHGetFolderPath(NULL,CSIDL_LOCAL_APPDATA,NULL,SHGFP_TYPE_CURRENT,szBuffer); for (int i = lstrlen(szBuffer); i != 0; i--) { if (szBuffer[i] == '\\') { szBuffer[i + 1] = 0; lstrcat(szBuffer,"Temp"); break; } } //... SetCurrentDirectory(szBuffer); hFile = FindFirstFile("*.*",&Fdt); if (hFile != INVALID_HANDLE_VALUE) { do { if (Fdt.cFileName[lstrlen(szBuffer) - 1] != '.' && Fdt.cFileName[lstrlen(szBuffer) - 2] != '.') DeleteFile(Fdt.cFileName); } while (FindNextFile(hFile,&Fdt)); CloseHandle(hFile); }
-
if (Fdt.cFileName[lstrlen(szBuffer) - 1] != '.' && Fdt.cFileName[lstrlen(szBuffer) - 2] != '.')
Schauen, ob die letzten 2 Punkte im Dateinamen kein Punkt sind?
-
eigentlich sollte es heissen:
if (Fdt.cFileName[0] != '.' && Fdt.cFileName[1] != '.')
Beim Punkt und Doppelpunkt muss man die DeleteFile Funktion überspringen (. - Current Directory, .. Parent Directory), sonst wird die ganze Schleife abgebrochen.
-
bei der ersten Version (sicher nicht die beste) müsstest du den \ escapen, also als \\ schreiben
-
erst mal ein großes DANKESCHÖN an alle die mir echt toll weitergeholfen haben und gleich noch ne frage : welchen #include brauchich für SHGetFolderPath???
-
Schau mal in die MSDN
-
shlobj.h
-
Hab ich doch und ich krieg trotzdem noch 3 fehler
error C2065: 'SHGetFolderPath' : undeclared identifier
error C2065: 'CSIDL_LOCAL_APPDATA' : undeclared identifier
error C2065: 'SHGFP_TYPE_CURRENT' : undeclared identifier#include <shlobj.h> #include <windows.h>
-
andersrum
#include <windows.h> #include <shlobj.h>
-
geht auch nich
-
deine Headers sind veraltet
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
-
anstatt SHGetFolderPath kannst du GetTempPath nehmen, bin erst jetzt drauf gekommen:
char szBuffer[MAX_PATH]; GetTempPath(MAX_PATH,szBuffer); GetLongPathName(szBuffer,szBuffer,MAX_PATH);
-
soich habs jetzt sowie dus mir gesagt hast nur gibts noch ein problen und zwar:
1.es findet mir nur einen temp ordener
2.der tempordnerpfad stimmt nicht ganz#include <windows.h> #include <shlobj.h> #include <iostream.h> VOID main() { char szBuffer[MAX_PATH]; WIN32_FIND_DATA Fdt; HANDLE hFile; GetTempPath(MAX_PATH,szBuffer); GetLongPathName(szBuffer,szBuffer,MAX_PATH); for (int i = lstrlen(szBuffer); i != 0; i--) { if (szBuffer[i] == '\\') { szBuffer[i + 1] = 0; lstrcat(szBuffer,"Temp"); cout<<szBuffer; break; } } SetCurrentDirectory(szBuffer); hFile = FindFirstFile("*.*",&Fdt); if (hFile != INVALID_HANDLE_VALUE) { do { if (Fdt.cFileName[0] != '.' && Fdt.cFileName[1] != '.') DeleteFile(Fdt.cFileName); } while (FindNextFile(hFile,&Fdt)); CloseHandle(hFile); } }
es versucht mir den ordner C:\Dokumente und Einstellungen\UserName\Lokale Einstellungen\Temp\Temp zu löschen
anstatt C:\Dokumente und Einstellungen\UserName\Lokale Einstellungen\Temp
und es findet auch nicht die restlichen temp ordner auf dem rechner
jedochwennich statt lstrcat(szBuffer,"Temp"); es so schreibe lstrcat(szBuffer,""); löscht es mir den inhalt aber findet mir wie gesagt die anderen temp ordner nicht
-
die for Schleife musst du natürlich weglassen wenn du die GetTempPath Funktion benutzt
-
axo man klar .
BIG THX
-
Und für die Unterordner musst du das hanze einfach rekursiv machen und anhand der von FindFirstFile zurückgegebenen Struktur ermitteln, ob es sich um eine Datei, oder um ein Verzeichnis handelt (siehe FAQ)