Mehrer Files umbennen



  • Also wiki sagt, dass dirent.h mittlerweile quasi C-Standard geworden ist
    (eigentlich POSIX). Unter Windows haengt es von deinem Compiler ab, ob
    die Bibliothek verfuegbar ist. Microsoft Visual C++ hat kein dirent.h.



  • Im WinAPI-Unterforum wird es einer wissen.
    Wahrscheinlich gibt es sogar schon einen Beitrag in der Richtung.

    Such doch mal im WinAPI-Forum nach z.B.: FindFirst



  • Hier sollte erschöpfende Information gefunden werden:
    http://msdn.microsoft.com/en-us/library/windows/desktop/aa364418(v=vs.85).aspx



  • Averroes schrieb:

    Weis es keiner wie ich den verlinkten Code im Windows realisieren kann

    dirent.h ist kein C-Standard, deshalb braucht der MSVC es auch nicht anzubieten.
    Fabulierungen wie "Quasi-Standard" helfen meist wenig, wie man auch an deinem Fall wieder sieht.
    Es gibt verschiedene Portierungen, die du nach ein paar Suchen auch leicht selbst hättest finden können:

    http://www.two-sdg.demon.co.uk/curbralan/code/dirent/dirent.html

    dirent.h+dirent.c runterladen, ins Projektverzeichnis kopieren, fertig.



  • Habe noch in meinen alten Projekten ein Beispiel gefunden.
    Es ist nur ein Code-Schnipsel 🙂
    Sollte aber gut zeigen wie man mit FindFirst zurch die Dateien Itariert.

    int search(char *pcPath)
    {
      HANDLE hfind;
      WIN32_FIND_DATA FileData;
      int FindMoreFiles;
      //Forschritt berechnen
    
        //Erstes File suchen
      hfind = FindFirstFile(pcPath,&FileData);
      if(hfind==INVALID_HANDLE_VALUE)
      {
        printf("Invalid Handle at %s",pcPath);
        return(0);
      }
      do
      {
        //Verzeichnis gefunden
        if(FileData.dwFileAttributes & 0x10)
        {
           ;
        }
        else
        {
          //Datei gefunden
          // FileData.cFileName ist die Datei die gefunden wurde
          continue;
        }
        // Nächstes Datei suchen
        FindMoreFiles = FindNextFile(hfind,&FileData);
      } while(FindMoreFiles);
      FindClose(hfind);
      iStack--;
      return(0);
    


  • Ich habe noch eine andere Idee:
    Mit dem folgenden Code,

    int listdir(const char *path) {
      struct dirent *entry;
      DIR *dp;
    
      dp = opendir(path);
      if (dp == NULL) {
        		perror("opendir: Path does not exist or could not be read.");
        		return -1;
      		}
    
      while((entry = readdir(dp)))
        puts(entry->d_name);
    
      closedir(dp);
      return 0;
    }
    

    welches ich hier gefunden habe, kann ich eine Liste der Dateien aus einem Ordner erstellen. Aber ich weis es nicht wie die einzelnen Dateien (aus der listdir) ansprechen kann 😕

    Mit

    int main .....
    for...
    listdir(argv[i]);
    

    geht es nicht 😞

    Gruß,
    Averroes

    PS: DANKE an ALLLE ihr seid 👍



  • entry->d_name
    

    In die Schleife musst du jetzt nur noch die Rename Funktion einfügen.

    rename(entry->d_name,"neuer Name");
    

    in argv gibst du ja nur das Verzeichniss an, in welchem sich die Dateien befinden.
    Du musst ausserdem im main die Funktion listdir aufrufen:

    int listdir(argv[1])
    

    Dein Programm anschlissten mit "MeinProg.exe Verzechniss" aufrufen .



  • Wieso fkt. dieser Code nicht 😕

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    
    int listdir(const char *path) {
      struct dirent *entry;
      DIR *dp;
    
      dp = opendir(path);
      if (dp == NULL) {
        		perror("opendir: Path does not exist or could not be read.");
        		return -1;
      		}
    
      while((entry = readdir(dp)))
        puts(entry->d_name);
    
      closedir(dp);
      return 0;
    }
    
    int main(int argc, char **argv) {
    
     	char neu[300];
             int listdir(argv[1]);
    	printf("Wie sollen die Dateien umbenannt werden:\n");
    	scanf("%c",neu);
    
    	for(int item = 1; item<argc; item++)
    	{
        	rename(entry->d_name,neu);
             	}
    
      return 0;
    }
    

    Gruß,
    Averroes



  • Averroes schrieb:

    Wieso fkt. dieser Code nicht 😕

    Bei der Fehlerbeschreibung: Weil du einen Fehler gemacht hast. 🙄

    Trotzdem:
    %c bei scanf liest nur ein Zeichen ein.
    Für eine Zeichenkette wäre %s sinnvoller.
    Allerdings liest das nur bis zu einem Leerzeichen.



  • In Zeile 26 beim Funktionsaufruf weist du den Rueckgabewert nicht
    wirklich einer Variablen zu, da steht einfach nur int vor.

    Und in Zeile 30 deklarierst du in einer for-Schleife eine neue
    Variable. In C89 geht das nicht (in C99 weiss ich nicht).



  • Aber ich bekomme immernoch Fehlermeldung für diesen Code 🙄

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include <dirent.h> 
    
    int listdir(const char *path) { 
      struct dirent *entry; 
      DIR *dp; 
    
      dp = opendir(path); 
      if (dp == NULL) { 
                perror("opendir: Path does not exist or could not be read."); 
                return -1; 
              } 
    
      while((entry = readdir(dp))) 
        puts(entry->d_name); 
    
      closedir(dp); 
      return 0; 
    } 
    
    int main(int argc, char **argv) { 
    
        char neu[300]; 
        int listdir(argv[1]); 
        printf("Wie sollen die Dateien umbenannt werden:\n"); 
        scanf("%s",neu); 
    
        for(int item = 1; item<argc; item++) 
        { 
            rename(entry->d_name,neu); 
                 } 
    
      return 0;
    }
    

    und zwar folgende:
    26: error: invalid conversion from 'char' to 'int'
    32: error: 'entry' was not declared in this scope

    Gruß,
    Averroes



  • Die Struktur existiert nur in der Funktion listdir(). Nach Beenden
    der Funktion kannst du von main() aus nicht mehr darauf zugreifen.
    Also musst du entweder das Umbenennen in der Funktion machen oder
    die Struktur in main() definieren und der Funktion als Argument geben.



  • for(int item = 1; item<argc; item++)
    

    was willst du mit argc genau machen?
    Du weisst schon, dass argc die Anzahl Argumente sind die du dem Programm mitgibst?

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    
    int listdir(const char *path) {
      struct dirent *entry;
      char neu[256];
      int iIndex=0;
      DIR *dp;
    
      dp = opendir(path);
      if(dp == NULL)
      {
        perror("opendir: Path does not exist or could not be read.");
        return(-1);
      }
    
      printf("Wie sollen die Dateien umbenannt werden:\n");
      scanf("%s",neu);
    
      while((entry = readdir(dp)),iIndex++)
      {
        sprintf(&neu[strlen(neu)],"%d",iIndex);
        rename(entry->d_name,neu);
      }
    
      closedir(dp);
      return(0);
    }
    
    int main(int argc, char **argv) {
    
      if(listdir(argv[1])<0)
        printf("listdir faild\n");
    
      return(0);
    }
    

    Ungetestet...



  • Binggi schrieb:

    while((entry = readdir(dp)),iIndex++)
      {
        sprintf(&neu[strlen(neu)],"%d",iIndex);  // Da ist immer das aktuelle neu drin
        rename(entry->d_name,neu);
      }
    

    Ungetestet...

    Das gibt sowas für Datei.txt

    Datei.txt1 
    Datei.txt12
    Datei.txt123
    

    Immer noch besser als alle Dateien mit dem selben Namen zu belegen. 👍



  • Schande über mich... 🙂

    So nun etwas mehr überlegt,xD

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    
    int listdir( char *path) {
      struct dirent *entry;
      char temp_neu[256];
      char neu[256];
      char old[256];
      int iIndex=0;
      char *firstPart,*secoundPart;
      DIR *dp;
    
      printf("Path = %s\n",path);
      dp = opendir(path);
      if(dp == NULL)
      {
        perror("opendir: Path does not exist or could not be read.");
        return(-1);
      }
      printf("Wie sollen die Dateien umbenannt werden:\n");
      scanf("%s",temp_neu);
      secoundPart=strrchr (temp_neu,'.');
      *secoundPart=0;
      firstPart=temp_neu;
    
      while((entry = readdir(dp)))
      {
        if(entry->d_name[0]=='.')
          continue;
    
        iIndex++;
        sprintf(neu,"%s/%s%d.%s",path,firstPart,iIndex,secoundPart+1);
        sprintf(old,"%s/%s",path,entry->d_name);
        printf("Old = %s   neu = %s\n",entry->d_name,neu);
    
        rename(entry->d_name,neu);
      }
    
      closedir(dp);
      return(0);
    }
    
    int main(int argc, char **argv) {
    
      if(listdir(argv[0])<0)
        printf("listdir faild\n");
    
      return(0);
    }
    

    Versuchs mal damit...



  • @Binggi: Bekomme immer
    listdir failed.
    Wie soll ich die *.exe ausführen?

    Gruß,
    Averroes



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <dirent.h>
    
    int listdir( char *path) {
      struct dirent *entry;
      char temp_neu[256];
      char neu[256];
      char old[256];
      int iIndex=0;
      char *firstPart,*secoundPart;
      DIR *dp;
    
      printf("Path = %s\n",path);
      dp = opendir(path);
      if(dp == NULL)
      {
        perror("opendir: Path does not exist or could not be read.");
        return(-1);
      }
      printf("Wie sollen die Dateien umbenannt werden:\n");
      scanf("%s",temp_neu);
      secoundPart=strrchr (temp_neu,'.');
      *secoundPart=0;
      firstPart=temp_neu;
    
      while((entry = readdir(dp)))
      {
        if(entry->d_name[0]=='.')
          continue;
    
        iIndex++;
        sprintf(neu,"%s/%s%d.%s",path,firstPart,iIndex,secoundPart+1);
        sprintf(old,"%s/%s",path,entry->d_name);
        printf("old = %s   new = %s\n",old,neu);
    
        rename(old,neu); //<- erster Parameter muss old sein... sonst gehts in die Hose
      }
    
      closedir(dp);
      return(0);
    }
    
    int main(int argc, char **argv) {
    
      if(listdir(argv[1])<0) //<-- Muss natürlich argv[0] heissen
        printf("listdir faild\n");
    
      return(0);
    }
    

    Aufruf: ProgName Verzeichniss

    Gruss Bingg



  • @Binggi --- DANKE!!!!!!!!
    Es tut genau das was ich will 😃

    Gruß und ein schönes Wochenende,
    Averroes


Anmelden zum Antworten