Hei taas kaikille! Peliä tehdessäni ilmeni seuraavanlainen ongelma: kun luen FindFirstFilella ja FindNextFilella kansion sisältöä, ohjelma väittää että kansio on tyhjä. FindFirstFile ja ensimmäinen FindNextFile löytävät tiedoston, jonka nimi on kansion nimi, mutta sen jälkeiset FindNextFilet eivät löydä mitään. Missä lienee syy?
Millaisella lausekkeella haet tiedostoja?
fhandle=FindFirstFile("C:\\game\\saves",&fdata); FindNextFile(fhandle,&fdata); c=0; while (FindNextFile(fhandle,&fdata)) { savename[c]=fdata.cFileName; c++; }
Tuo onglema tuli itsellänikin vastaan joskus (dos-versio findfirst ja findnext). Muistaakseni muuttujaan cFileName ei sisällytetä hakemistopolkua; eli jos hakemistossa c:\game\save olisi tiedosto save1.sav, niin cFileName:n sisältö olisi "save1.sav".
Toiseksi, muitaisin että hakuehtona pitäisi antaa myös tiedoston pääte ja kansioita läpikäydessä myös se viimeinen \-merkki eli
fhandle = FindFirstFile("C:\\GAMES\\SAVES\\.*", &fdata); while(FindNextFile(handle, &fdata) != INVALID_HANDLE_VALUE) printf(fdata.cFileName);
En mene takuuseen koodin toiminnasta.
Tuossa siirrät jokaisen savename-taulukon alkion osoittamaan samaan tekstiin kuin fdata.cFileName. char-taulukoita ei oi siirtää tuolla tavalla. Sinun pitää varata tuolle savename-taulukolle muistia MAX_PATH-vakion verran jokaiselle riville ja kopioida tuo fdata.cFileName sinne (strcpy, sprintf tai for-silmukka). Miksi muuten jätät tuon FindFirstFile-funktion löytämän tiedoston listaamatta?
Muistathan käyttää kooditageja.
Kiitos avusta ja anteeksi tagittomuudesta!
Tuo on helppo myös tehdä DJGPP:llä:
#include <stdio.h> #include <dir.h> int main(void) { struct ffblk f; int done = findfirst("C:\\GAMES\\SAVES\\*.*", &f, FA_HIDDEN | FA_SYSTEM); while (!done) { printf("%s\n", f.ff_name); done = findnext(&f); } return 0; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.