Eli oon tehnyt funktion joka ottaa parametrikseen kansion nimen ja sitten poistaa siitä kaiken sisällön. Mutta jokin siinä menee vikaan koska vaikka se menee kääntäjästä läpi, se ei yksinkertaisesti tee mitään.
char poistetut_tiedostot[256]; char polku_[256]; WIN32_FIND_DATA w32FindData; HANDLE hTiedosto; char polku[256]="C:\\omat\\"; char c[256]; BOOL CleanDir(char c[256]) { char tiedostonimi[256]; char tiedosto_haku[256]; char poistetut[256]; strcpy(tiedostonimi, c); strcpy(tiedosto_haku, c); strcat(tiedosto_haku, "*"); hTiedosto = FindFirstFile(tiedosto_haku, &w32FindData); if(hTiedosto != INVALID_HANDLE_VALUE) { do{ if(w32FindData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { strcat(tiedostonimi, w32FindData.cFileName); CleanDir(tiedostonimi); RemoveDirectory(tiedostonimi); strcpy(tiedostonimi, c); } else { strcat( tiedostonimi, w32FindData.cFileName); DeleteFile(tiedostonimi); strcpy(tiedostonimi, c); strcpy(poistetut, w32FindData.cFileName); strcpy(poistetut, " "); }} while(FindNextFile(hTiedosto, &w32FindData)); } strcpy(poistetut_tiedostot, poistetut); strcpy(polku_, c); if(!hTiedosto){return FALSE;} else {return TRUE;} }
Jaa...näin pintapuolisesti katsomalla olin huomaavinani ainakin seuraavaa:
strcat(tiedostonimi, w32FindData.cFileName);
Tuossahan käy niin että syntyvästä hakemisto+tiedostonnimi string:stä jää puuttumaan '\'-merkki.
Myös alussa oleva:
strcat(tiedosto_haku, "*");
kannattaisi pistää vaikka muotoon:
strcat(tiedosto_haku, "\\*.*");
Älä ihmeessä hyvä mies laita testaamattomaan koodiin RemoveDirectory tai DeleteFile-kutsuja.
Kirjoittelen sinulle myöhemmin illalla toimivan koodin.
Eli tässä olisi (muista korvata tulostukset poistokutsuilla, eli RemoveDirectorylla ja DeleteFilellä)
/* * recursive directory cleaner, thefox 2004 * * note: just an example, and thus doesnt really remove anything * * note: apparently doesnt handle directories containing system directories, * for example temporary internet files */ #include <stdio.h> #include <stdlib.h> #define WIN32_LEAN_AND_MEAN #include <windows.h> BOOL clean_directory(char *dir, int rec); int main(void) { clean_directory("C:\\tmp", 0); } /* note: the 'dir' shouldnt contain the trailing backslash ('\') and it shouldnt exceed MAX_PATH - 2 characters */ BOOL clean_directory(char *dir, int rec) { char fname[1024]; WIN32_FIND_DATA w32fd; HANDLE hf; int files = 0; printf("cleaning dir: %s\nlevel of recursion: %d\n", dir, rec); /* note: this code is not safe (buffer overflow may occur) */ strcpy(fname, dir); strcat(fname, "\\*"); hf = FindFirstFile(fname, &w32fd); if(hf == INVALID_HANDLE_VALUE) return FALSE; /* go thru all the files (and directories) in the current directory */ do { char tmp[1024]; if(w32fd.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { /* it's a directory, clean if not a special directory */ strcpy(tmp, dir); strcat(tmp, "\\"); strcat(tmp, w32fd.cFileName); if(strcmp(w32fd.cFileName, ".") != 0 && strcmp(w32fd.cFileName, "..") != 0) { if(clean_directory(tmp, rec + 1) == TRUE) { printf("directory cleaned\nlevel of recursion: %d\n", rec); } else { printf("no files were deleted\n"); }; } } else { /* it's a file */ strcpy(tmp, dir); strcat(tmp, "\\"); strcat(tmp, w32fd.cFileName); printf("delete file: %s\n", w32fd.cFileName); files++; } } while(FindNextFile(hf, &w32fd)); return (files > 0) ? TRUE : FALSE; }
Huomautan vielä että tein tämän vain koska kesäloma alkoi juuri :)
edit: tietysti siinä oli pikku bugi, ja varmaan on vieläkin mutta kelvannee esimerkiksi. Tuon tulostukset voivat olla hieman kryptisen oloisia mutta kyllä niistä ihan logiikka löytyy :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.