Ordnernamen in einem Verzeichniss an eine variable übergeben



  • Guten Tag,

    ich hoffe ihr könnt mir helfen,

    da ich leider anfänger in C bin, möchte ich euch bitten mir meine Fehler zu
    verzeihen.

    Nun zu meinem Problem, ich möchte den Inhalt eines Verzeichnisses (also Ordnernamen und Dateinamen) auslesen und die Ordnernamen an variablen übergeben,
    leider weiss ich nicht genau wie ich das anstellen kann, hier mal mein Code, wie ich es probiert habe.

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <conio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    
        system("color 9C");
    
        printf("                                    Test\n");
        printf("                          ------------------------\n\n");
    
        HANDLE fHandle;
        WIN32_FIND_DATA wfd;
    
        int i=0;
        int n=-1;
        char namen[200];
        int d=1;
    
         fHandle=FindFirstFile("C:\\hyperMILL_DATA\\*",&wfd);
    
             do
              {   
    		     if (wfd.cFileName[0]=='.');                                                                                   
                 else if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
              {
                  printf("Ordner: %d. %s\n",n,wfd.cFileName);
                  strcpy(namen[d],wfd.cFileName);
              }
               else
              {
                  printf("Datei : %d. %s\n",n,wfd.cFileName);
              }
               i++;
               n++;
               d++;
              }
    
        while (FindNextFile(fHandle,&wfd));
      FindClose(fHandle);
    
      system("PAUSE");	
      return 0;
    }
    

    allerdings bekomme ich die Meldung main.c hat ein Problem festgestellt und muss beendet werden. Ich habe schon rum gegoogelt und alles mögliche probiert, aber ich bin jetzt an einem Punkt wo ich ohne hilfe nicht weiterkomme.
    Ich hoffe ihr könnt mir helfen, meine IDE ist Orwell Dev-C++ ver. 5.6,
    folgenden Fehler zeigt die IDE beim kompilieren an:

    http://imageshack.com/a/img543/7499/rz59.jpg

    Vielen Dank schonmal für eure mühe



  • Was möchtest du denn mit namen[200] anstellen?

    Das ist ein Array für 200 Zeichen. Zeichen, nicht Strings (oder Ordnernamen)

    Zudem fängt der Index bei Arrays bei 0 an. Immer.

    Lass erstmal das [d] beim strcpy weg. Dann sollte die Warnung beim strcpy weg sein.



  • Hi, vielen Dank für die schnelle antwort,

    ich hab mich wohl etwas unverständlich ausgedrückt,

    ich möchte jeden Ordnernamen einer eigenen Variablen zuordnen:

    char Ordner1=Ordnername 1
    char Ordner2=Ordnername 2
    char Ordner3=Ordnername 3
    ....
    

    habe das "d" bei strcpy weggelassen, vielen Dank für den tipp, der Fehler ist jetzt auch weg, das Programm wird ohne weitere Meldung Kompiliert, die Ordner im
    Verzeichniss werden auch angezeigt, aber wie bekomme ich jetzt die Ordnernamen in eine (dynamische) Variable reingeschrieben? Hab leider keine vorstellung wie ich das anstellen soll.

    Ich weiß soweit das wfd.cFileName den Ordnernamen beinhaltet, aber ich schaffe es nicht bei jedem durchlauf der Schleife wfd.cFileName an jeweils eine andere Variable zu übergeben.

    Hoffe das es jetzt etwas verständlicher ist



  • Dafür benötigst du ein Array, d.h. z.B.

    char namen[10][200];
    

    Da die Anzahl (der Dateien in einem Ordner) aber vorher nicht bekannt ist, müsstest du dynamisch mittels malloc() den Speicher anfordern (und evtl. per realloc() vergrößern).



  • Was macht denn i ausser munter vor sich hin zu zählen?
    Wieso startet n bei -1?
    Was passiert wenn FindFirstFile nix findet?
    ...



  • Es hat funktioniert, wie geil, vielen vielen Dank.

    "i" war nur ne Variablen leiche vom rum probieren 🙂

    "n" startet bei minus 1, da FindFirstFile als erstes einen "." und als zweites einen ".." bei mir findet, diese will ich aber nicht nummerieren da ich diese nicht auflisten möchte:

    if (wfd.cFileName[0]=='.');
    

    was passiert wenn FindFirstFile nichts findet, habe ich mir ehrlich gesagt noch net überlegt, da werde ich mich mich aber als nächstes dran setzen, danke für den Hinweis. Von "malloc()" und "realloc()" habe ich leider noch nie was gehört, da ich noch ein ganz blutiger Anfänger im Programmieren bin :),
    aber ich werde mich da mal reinfuchsen und zu gegebener Zeit mal den fertigen Code hier präsentieren.

    Der vollständigkeit halber hier der Code wie er bei mir jetzt funktioniert

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <conio.h>
    #include <string.h>
    
    int main(int argc, char *argv[])
    {
    
        system("color 9C");
    
        printf("                                    Test\n");
        printf("                          ------------------------\n\n");
    
        HANDLE fHandle;
        WIN32_FIND_DATA wfd;
    
        int n=-1;
        char namen[50][200];
        int d=1;
    
         fHandle=FindFirstFile("C:\\hyperMILL_DATA\\*",&wfd);
    
             do
              {   
    		     if (wfd.cFileName[0]=='.');                                                                                   
                 else if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
              {
                  printf("Ordner: %d. %s\n",n,wfd.cFileName);
                  strcpy(namen[d],wfd.cFileName);
              }
               else
              {
                  printf("Datei : %d. %s\n",n,wfd.cFileName);
              }
               n++;
               d++;
              }
    
              while (FindNextFile(fHandle,&wfd));
      FindClose(fHandle);
    
      system("PAUSE");	
      return 0;
    }
    

    Danke nochmal für eure mühe und tipps



  • deejayextasy schrieb:

    Es hat funktioniert, wie geil, vielen vielen Dank.

    Du musst aber aufpassen.
    Windows-Dateinamen können Länger als 200 Zeichen sein.
    Es können auch mehr als 50 Unterordner in einem Verzeichnis sein.

    Diese Grenzen überprüfst du nirgends.
    Das gibt dann im Grenzfall einen Pufferüberlauf.


Log in to reply