Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

1

13.06.2011, 08:55

C++ - Ordnerninhalt auflisten (wie DIR)

Sehr geehrtes Forum,
ich wollte euch mal fragen, wie man den Inhalt eines Ordners auflisten kann (ich will nur die Dateien des Ordners, keine Unterordner, wenn da welche drin sind mitzählen).

Ich habe schon danach gegoogled, aber finde leider nichts brauchbares, was ich wirklich haben will.

In der MS-DOS-Console gibt es den Befehl DIR, oder in Java :

C-/C++-Quelltext

1
2
File f = new File("C:/Test");
String[] files = f.list();


Der Gibt den Inhalt als Stringarray wieder, sowas hätte ich gerne in C++.

Danke für eure Hilfe,
m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

13.06.2011, 08:58

Das geht nicht mit der STD lib von C++, dazu brauchst du die WinAPI:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
void lsdir(const char *path, Array<String> &results)
{
        WIN32_FIND_DATA fdata;
        HANDLE dhandle;

        // must append \* to the path
        {
                char buf[MAX_PATH];
                snprintf(buf, sizeof(buf), "%s\\*", path);
                if((dhandle = FindFirstFile(buf, &fdata)) == INVALID_HANDLE_VALUE) {
                        throw Error("FindFirstFile");
                }
        }

        // even an "empty" directory will give two results - . and ..
        results.append(String(fdata.cFileName));

        while(1) {
                if(FindNextFile(dhandle, &fdata)) {
                        results.append(String(fdata.cFileName));
                } else {
                        if(GetLastError() == ERROR_NO_MORE_FILES) {
                                break;
                        } else {
                                FindClose(dhandle);
                                throw Error("FindNextFile");
                        }
                }
        }

        if(FindClose(dhandle) == 0) {
                throw Error("FindClose");
        }
}

Quelle: http://discuss.fogcreek.com/joelonsoftwa…ow&ixPost=23721

PS: Woho, Post #1900... bald gibts was zu feiern ;)

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

3

13.06.2011, 09:06

Erstmal danke für deine Hilfe, aber :
Ich habe
#include <iostream.h>
#include <windows.h>
Included, aber der findet bei mir trotzdem viele dinge nicht,
z.B.

Quellcode

1
2
3
4
5
6
7
F:\C++ Projekte\DoctorDangerous_ProfileSelector\ProfileSelectorGUI.hpp||In function 'void dir(std::string)':|
F:\C++ Projekte\DoctorDangerous_ProfileSelector\ProfileSelectorGUI.hpp|66|error: 'snprintf' was not declared in this scope|
F:\C++ Projekte\DoctorDangerous_ProfileSelector\ProfileSelectorGUI.hpp|68|error: 'Error' was not declared in this scope|
F:\C++ Projekte\DoctorDangerous_ProfileSelector\ProfileSelectorGUI.hpp|73|error: 'String' was not declared in this scope|
F:\C++ Projekte\DoctorDangerous_ProfileSelector\ProfileSelectorGUI.hpp|83|error: 'Error' was not declared in this scope|
F:\C++ Projekte\DoctorDangerous_ProfileSelector\ProfileSelectorGUI.hpp|89|error: 'Error' was not declared in this scope|
||=== Build finished: 9 errors, 0 warnings ===|


Was muss ich da includen, ja ich bin Windows-User, leider.
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

4

13.06.2011, 09:16

OK, sprintf ist in
#include <stdio.h>

Aber "String" und "Error" findet er immer noch nicht, was muss ich da includen?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

5

13.06.2011, 10:33

Wenn ich den Code so umschreibe, dass keine Errors mehr gebraucht werden, und keine Strings,
dann sieht das ganze so aus :

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void ProfileSelectorGUI::dir(string path)
{
    WIN32_FIND_DATA fdata;
    HANDLE dhandle;

    // must append \* to the path
    {
        char buf[MAX_PATH];
        snprintf(buf, sizeof(buf), "%s\\*", path.c_str());
        if((dhandle = FindFirstFile(buf, &fdata)) == INVALID_HANDLE_VALUE)
        {
            ;
        }
    }

    // even an "empty" directory will give two results - . and ..
    profiles.push_back((fdata.cFileName));

    while(true)
    {
        if(FindNextFile(dhandle, &fdata))
        {
            profiles.push_back((fdata.cFileName));
        }
        else
        {
            if(GetLastError() == ERROR_NO_MORE_FILES)
            {
                break;
            }
            else
            {
                FindClose(dhandle);
            }
        }
    }

    if(FindClose(dhandle) == 0)
    {
        ;
    }
}

profiles stellt einen vector<string> dar.

Doch leider passiert folgendes :
Es wird nur, wenn man den inhalt von profiles ausgeben lässt, nur . und .. ausgeben (also die die immer ausgegeben werden).

Ich habe eine Datei eingefügt, in der Ordner, doch trotzdem wird nur . und .. ausgeben.

Kann mir einer sagen warum?

Danke,
m.f.G. Developer_X
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

6

13.06.2011, 11:11

Also erst mal was zum Code:
Ich habe es immer so gemacht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdafx.h>

int ListFiles(char *Dir){
    HANDLE hFile;
    LPWIN32_FIND_DATA File;
    File = new _WIN32_FIND_DATAA;

    char *sDir = new char[1024];
    strncpy(sDir, Dir, 1024);
    strcat(sDir, "*.*");

    // Erste Datei suchen
    hFile = FindFirstFile(sDir, File);

    //Alle Dateien in diesem Ordner durchgehen
    do{
        // Falls die Datei "." oder ".." heißt, eifach überspringen, da die
        // zu den übergeorndeten Ordnern führen
        if(!strcmp(File->cFileName, ".") || !strcmp(File->cFileName, "..")){
            continue;
        }

        // Falls die Datei kein Ordner ist, zur Liste hinzufügen
        if(!(File->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)){
            // Hinzufügen
            printf("%s\n", File->cFileName);
        }
    }
    while(FindNextFile(hFile, File)); //Alle Dateien in diesem Ornder durchgehen...
}
Ich glaube einfach, das ist ein bisschen übersichtlicher!

Und jetzt zu deiner Frage:
Die Dateien "." und "..", die bei dir ausgegeben werden, verweisen auf das aktuelle und das übergeordnete Verzeichnis (So weit ich weiß!). Deshalb überspringe ich die auch. (Z.: 19 - 21)
Um alle Daten auszugeben solltest du außerdem mal das %s\\* durch %s\\*.* ersetzen (s. Z.: 10). Bin mir nicht sicher, ob es daran liegt, aber mein Code funktioniert auf jeden Fall immer reibungslos. ;)
Wenn ich genauer erklären soll, warum meiner Meinung nach da der Fehler liegt... frag einfach nach! ^^ ;)

Hoffe, ich konnte helfen! ^^

Mfg Harry222

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

7

13.06.2011, 11:34

Danke, und nein, es hat leider nicht an %s\\ gelegen.

Eine Frage zu deinem Code :
Deine Funktion ist vom Typ int, doch du machst nie eine Rückgabe (return)^^
Warum?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

8

13.06.2011, 11:37

Deine Funktion ist vom Typ int, doch du machst nie eine Rückgabe (return)^^

Die Funktion in meinem Programm war eigentlich viel länger! Hab Teile entfernt um nur das Entscheidene übrig zu lassen!

Hast du denn mal meinen Code ausprobiert?

Mfg Harry222

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

9

13.06.2011, 11:38

ich habe außedem leider das include
#include <stdafx.h>

nicht, also ich benutze codeblocks, was soll ich da machen?
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Developer_X

Treue Seele

  • »Developer_X« ist der Autor dieses Themas

Beiträge: 247

Wohnort: Hessen

Beruf: Schüler

  • Private Nachricht senden

10

13.06.2011, 11:43

Ah, ich hab herausgefunden, wenn ich das weglasse, gehts auch mit dem compilieren^^.

Leider zeigt er mir, die Dateien nicht, und gibt nichts in der console aus.
:(
- Die Zeit ist wie ein Fluss, und die Gegenwart wie ein Fels, der von dem Fluss der Zeit geschliffen wird. -
Kevin Riehl

Werbeanzeige