Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Verzeichnisse auflisten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
05.01.2007, 23:09 Uhr
~Pingu625
Gast


Hi

Ich habe ein kleines Problem...

Nach stundenlangem googlen fand ich folgendes Beispiel:

C++:
void Directories (AnsiString dir)
{

    WIN32_FIND_DATA hFindData;
    HANDLE hFind;
    AnsiString help;
    AnsiString subDir;

    help = dir + "*.*";

    hFind = FindFirstFile(help.c_str (), &hFindData);
    while ((hFind != INVALID_HANDLE_VALUE) && (GetLastError() != ERROR_NO_MORE_FILES))
    {
        if (hFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && strcmp (hFindData.cFileName, ".") &&
            strcmp (hFindData.cFileName, ".."))
        {
                    // subdir
                    subDir = dir + hFindData.cFileName + "\\";
                    
            Directories (subDir);
        }
        else
        {
                        Form1->ListBox1->Items->Add(dir + hFindData.cFileName);
        }
        FindNextFile(hFind, &hFindData);
    }
    FindClose(hFind);
}



Nun rufe ich diese Funktion mit:
Directories("C:\\");
auf.

Soweit klappt alles.

Jedoch bringt er mir falsche Ergebnisse...

Zitat:

C:\19615b817b23109e76ec\.
C:\19615b817b23109e76ec\..
C:\19615b817b23109e76ec\msxml4-KB927978-enu.log



Und das kann ja nicht alles sein... Ich habe viel mehr Ordner und Dateien.

Warum hört er direkt nach dem ersten Ordner auf?
und wie kann man das Problem lösen?

Danke im vorraus ;)

Pingu

EDIT: Smilies deaktiviert, damit man den Code sieht, ohne :\ Smilies

Dieser Post wurde am 05.01.2007 um 23:10 Uhr von Pingu625 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.01.2007, 10:57 Uhr
Th



Deine Abfrage ist stümperhaft...

Zitat:

hFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && strcmp (hFindData.cFileName, ".") && strcmp (hFindData.cFileName, ".."))



Wenn du schon mit der Borland-VCL programmierst, dann könntest du auch die VCL-Dateifunktionen (FindFirst, FindNext, FindClose) benutzen (anstatt die Win-API).

Am besten, du debuggst deinen Source, dann findest du auch die logischen Fehler...

Dieser Post wurde am 08.01.2007 um 10:57 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.01.2007, 15:11 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Die Abfrage ist nicht stümperhaft, sondern schlichtweg falsch.

Ein Dateiname kann nicht "." und gleichzeitig ".." sein; mir schleicht sich der Verdacht auf, dass der Anwender die Funktionsweise der genutzten Funktion nicht durchschaut.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.01.2007, 15:12 Uhr
~Pingu625
Gast


Hi

@Reyx: Damit könntest du recht haben

Wie gesagt habe ich diesen Code aus einem anderen Forum übernommen.

Wenn du sagst, es kann nicht "." und ".." gleichzeitig sein, was kann ich dagegen tun?

Besonders bei folgendem weiß ich nicht, was der Befehl bewirkt:
strcmp (hFindData.cFileName, "..") und strcmp (hFindData.cFileName, ".")

Pingu

Dieser Post wurde am 08.01.2007 um 15:17 Uhr von Pingu625 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.01.2007, 16:42 Uhr
Reyx
IT-fetischistischer Wurstsalat mit rostigem Berghorn
(Operator)


Das ist eben der Befehl, den ich meinte.
An der Stelle wird geprüft, ob der Name des Verzeichnisses ".." und gleichzeitig "." ist. Falls ja, glaubt das Skript, es hätte ein Unterverzeichnis gefunden, und will dessen Inhalt auslesen.

"." steht für das aktuelle Verzeichnis.
".." steht für das übergeordnete Verzeichnis.

Beide Namen müssen übersprungen werden, wenn du alle Unterverzeichnisse durchgehen willst (ggf. auf AnsiString casten, wenn er den ==-Operator nicht nimmt):

C++:
if(hFindData.cFileName == "." || hFindData.cFileName == "..")
   continue;


Ist dir die Funktionsweise von rekursiven Funktionen bewusst? Falsch nicht, solltest du dich erkundigen, sonst könnte es schwierig sein, für dich zu verstehen, was der Code macht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.01.2007, 20:59 Uhr
~Pingu625
Gast


Ja ok, erstmal danke für die Hilfe.

Ich habe in PHP schon desöftern mit rekursiven Funktionen gearbeitet. Ich werde mir das ganze nochmal sehr genau durchschauen, damit ích den Code besser verstehe.

Aber jetzt erstmal zu deinem Tipp.
Ich denke mal, dein Code zum überspringen des Schleifendurchgangs müsste an den Anfang der Schleife...
Außerdem müsste man doch sicherlich aus der if-Abfrage für ein Unterverzeichnis diese beiden (".","..") Fälle streichen, da beide gleichzeitig ja nicht sein können.

Nun müsste der Code in etwa so aussehen:

C++:
while ((hFind != INVALID_HANDLE_VALUE) && (GetLastError() != ERROR_NO_MORE_FILES))
    {
                if(hFindData.cFileName == "." || hFindData.cFileName == "..")
                                continue;

                if (hFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
                    // subdir
                    subDir = dir + hFindData.cFileName + "\\";

            Directories (subDir);
        }
        else
        {
                        Form1->ListBox1->Items->Add(dir + hFindData.cFileName);
        }
        FindNextFile(hFind, &hFindData);
    }



Aber irgendwie stimmt er doch nicht. Ich weiß nicht, ob ich den Fehler finde wenn ich vllt. das mit den rekursiven Funktionen wieder anschaue.

Aber vllt. ist es ja auch was ganz simples, wie das mit dem AnsiString.

Ich les mir jetzt erst nochmal ein bisschen über rek. Funktionen durch, dann schau ich weiter.

Aber vllt. ist einer von euch schneller mit Fehler finden...

Pingu

EDIT: Noch ne Frage.
Wird durch das continue; überhaupt "FindNextFile(hFind, &hFindData);" ausgeführt, sodass nicht immer auf der gleichen Datei rumgehackt wird?
Oder ist das eine Art Endlosschleife, die nicht endlos ist. Mein PC hängt sich zwar nicht auf, aber er gibt mir eine tolle Datei aus.
Ungefähr so:
C:\xy\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\.\z.bmp

Dieser Post wurde am 08.01.2007 um 21:13 Uhr von Pingu625 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: