anzahl der dateien in einem ordner ...
-
nabend!
der titel is vielleicht nich richtig gewählt, weil ich mit ner ganz bestimmten sache probleme habe. allerdings geb ich euch mal den ganzen code der funktion:void anzahlbilderermitteln () { fHandle=FindFirstFile(pfad,&wfd); FindNextFile(fHandle,&wfd); // ein Punkt FindNextFile(fHandle,&wfd); // zwei Punkte FindNextFile(fHandle,&wfd); // Thumbs.db lstrcat(erstefile,wfd.cFileName); do { FindNextFile(fHandle,&wfd); cout<<(wfd.cFileName)<<endl; } while ( wfd.cFileName == erstefile); FindClose(fHandle); }
jetzt das offensichtliche prob: natürlich kann die bedingung nie wahr werden ... das eine is ja nen pointer und das andre nen string. (oder nich?)
jetzt die frage: ich wills so lösen, dass die wfd.FileName in nen string geschrieben wird, und der dann mit "erstefile" verglichen wird. wie kann ich das bewerkstelligen?-> oder gibts vielleicht schon ne funktion für die ermittlung der anzahl der dateien in einem ordner?
thx , cu und gute nacht!
SirNoname
-
int ZaehleDateienInOrdner(LPSTR Ordner) { WIN32_FIND_DATA FileData; HANDLE hSearch; int DateiAnzahl=0; SetLastError(ERROR_SUCCESS); hSearch = FindFirstFile(Ordner, &FileData); if (hSearch != INVALID_HANDLE_VALUE) { while (GetLastError() != ERROR_NO_MORE_FILES) { if((_stricmp(FileData.cFileName, ".")!=NULL)&&(_stricmp(FileData.cFileName, "..")!=NULL)&&(_stricmp(FileData.cFileName, "Thumbs.db")!=NULL)) { DateiAnzahl++; } FindNextFile(hSearch, &FileData); } FindClose(hSearch); } return DateiAnzahl; }
Warum nicht so (habs nicht getestet, Prinzip sollte aber klar sein).
-
ja ... so kann mans dann auch machen
... das werd ich dann in betracht ziehen wenn meins nich funzt.
aber wie geht das mit dem string?SirNoname
-
Strings vergleicht man z. B. mit strcmp().
Du kannst (wie in meinem Beispiel) also Dein wfd.cFileName mit Deinem erstefile vergleichen.
Das wirds aber nicht bringen.
Geh mal Zeilenweise durch Dein Programm:
- FindFirstFile wird aufgerufen
- Dann rufst Du 3 mal FindNextFile auf (das kann u. U. auch in die Hose gehen, wenn es z. B. keine Thumbs.db gibt). Du bedenkst allerdings nicht, das FindFirstFile auch schon einen Dateinamen zurückgibt (das müßte dann der eine "." sein!)
- Die 4. gefundene Datei kopierst Du in einen String.
- Dann startet die do{}while-Schleife, die nur ein einziges Mal durchlaufen wird, weil FindNextFile definitiv einen anderen Dateinamen zurückgibt als Du in "erstefile" gespeichert hast!Folgende Probleme sehe ich da noch in deinem Code:
- Du prüfst nicht, ob fHandle gültig ist! Wenn Du z. B. in einem Ordner nach *.txt suchst, aber keine TXT-Dateien vorhanden sind, dürfte das ordentlich scheppern...
- Wie oben angesprochen: Du überspringst Dateinamen in der Annahme, Du kennst die Reihenfolge der Dateinamen genau... Das geht 100%ig in die Hose!Schau Dir nochmal meinen Code an und versuche zu verstehen, was er tut!
-
@ hepi: sorry ... mein code war wirklich müll. hab ihn mir nochmal bei tageslicht betrachtet und deine meinung einbezogen und ... naja
neuer versuch:
int kontrolle=0, anzahlbilder=0; char lastfile[1000]=""; void anzahlbilderermitteln () { fHandle=FindFirstFile(pfad,&wfd); FindNextFile(fHandle,&wfd); // ein Punkt FindNextFile(fHandle,&wfd); // zwei Punkte //FindNextFile(fHandle,&wfd); // Thumbs.db -> wird in der schleife gemacht <- lstrcat(lastfile,wfd.cFileName); while (kontrolle == 0) { FindNextFile(fHandle,&wfd); cout<<(wfd.cFileName)<<endl; if (wfd.cFileName == lastfile) { kontrolle = 1; } else { lstrcat(lastfile,wfd.cFileName); // wird ja immer nur hinten drangehängt ... anzahlbilder=anzahlbilder+1; } } FindClose(fHandle); }
-> so is das. meine probleme jetzt: hab ich ja schon drangeschrieben in der if - else: der befehl lstrcat hängt ja nur etwas hinten an einen string dran. wie also lautet der befehl, einen string ab der ersten stelle wieder zu beschreiben? ich mein mit dem zuweisungsoperator " x="bla bla" " gehts ja schlecht ...
und das mit dem "." , ".." und der "Thumbs.db" is nich wirklich ein problem: die Thumbs wird von meinem prog in den ordner geschoben, um anderen problemen aus dem weg zu gehen, ist also 100%ig da. und die anderen beiden "." und ".." ... naja die krieg ich immer als erste beiden dateien in einem ordner angezeigt.
-> wichtig für mich is jetz erstmal der befehl für das löschen eines strings ... den rest krieg ich schon hin (und wenns wieder monate dauert
) ...
SirNoname
-
String löschen:
ZeroMemory(String, sizeof(String));
Warum nimmst Du strcat?
Nimm strcpy (oder eben lstrcpy), das ersetzt den String komplett...
if (wfd.cFileName == lastfile)
Mit der Zeile hab ich noch irgendwie ein Problem....
nimm lieber
if (NULL==lstrcmp(wfd.cFileName,lastfile))
Wie gesagt, 2 Strings vergleicht man mit strcmp (oder einer Variation dieser Funktion, wie z. B. lstrcmp)
strcmp liefer NULL zurück, wenn beide Strings absolut gleich sind.Nach wie vor prüfst Du nicht, ob fHandle ein "gültiger" Handle ist...
Laß mal Dein Programm auf einen nicht existierenden Ordner los, wunder Dich dann aber nicht über die Schutzverletzung...
-
Ich weiß nicht genau, was du vorhast, aber suchst du lstrcpy ?!
-
jawollst!
@ hepi: genau das hab ich gesuch!
hier mein code:int kontrolle=0, anzahlbilder=0; char lastfile[1000]=""; void anzahlbilderermitteln () { fHandle=FindFirstFile(pfad,&wfd); FindNextFile(fHandle,&wfd); // ein Punkt FindNextFile(fHandle,&wfd); // zwei Punkte //FindNextFile(fHandle,&wfd); // Thumbs.db -> wird in der schleife gemacht <- strcpy(lastfile,wfd.cFileName); while (kontrolle == 0) { FindNextFile(fHandle,&wfd); if (NULL==lstrcmp(wfd.cFileName,lastfile)) { kontrolle = 1; } else { strcpy(lastfile,wfd.cFileName); anzahlbilder=anzahlbilder+1; } } FindClose(fHandle); }
-> es funzt genauso wie es soll!
und das mit dem prüfen des fHandle ... geständniss: hab keine ahnung, was ein Handle überhaupt ist. wenn du meine letzten beiträge durchliest, wirst du merken, dass ziemlicher müll dabei war ... typisch newbee
jedenfalls hab ich mal frei nach dem motto "Geh nur junger Freund, das Wissen kommt nach!" dieses Handle genutzt und euch hier im forum nicht mit der frage belästigt. mein infolehrer hält das zwar für ne schwäche, aber ich bin ein typischer learning-by-doing-mensch ... fHandle hat funktioniert, also bleibt es drin ... was immer es auch ist *g*
ähnlich geht es mir mit dem ordner ... du sagst wenn er nich existiert gibs probleme ... glaub ich dir: schon vorgekommen. ich arbeite mich stück für stück heran ... bis jetz funktionierts alles so wie`s soll, DAU-sicherungen kommen später. (und eigentlich passiert ja nichts RICHTIG schlimmes ... ich mein ne fehlermeldung und gut is ... naja)-> jedenfalls thx für die hilfe und: ihr seht mich wieder!
SirNoname