Mehrer Files umbennen
-
Averroes schrieb:
Wow,
wusste nicht, dass Ihr so schnell seit
Die Dateien:
blibli.txt, blublu.txt und blabla.txt .....
Ich möchte sie alle einheitlich nennen wie:
fahrt1.txt, fahrt2.txt etc ....Gruß,
AverroesDann gehst du in einer Schleife die umzubenennenden Dateien durch. Dabei lässt du einen Zahler mitlaufen. Mit dem Zähler und dem Namensrumpf bastelst du dir dann mit den Zeichenkettenmanipulationsfunktionen den Zieldateinamen. Dann rufst du rename auf.
-
SeppJ schrieb:
Mit dem Zähler und dem Namensrumpf bastelst du dir dann mit den Zeichenkettenmanipulationsfunktionen den Zieldateinamen. Dann rufst du rename auf.
Wäre da sprintf nicht einfacher?
-
Aber wie bekomme ich all die Dateien in einer Liste und wie spreche ich sie an?
Gruß,
Averroes
-
Nimm am besten gleich argv als Liste.
Ok, mal Q&D:// Auruf mit: Programmname fahrt%d.txt blibli.txt blublu.txt blabla.txt int main(int argc, char *argv[]) { char neu[300]; int i; if (argc < 3) { fprintf(stderr, "Zuwenig Argumente: %s neuerName alterName [alterName2 ...]\n", argv[0]); return EXIT_FAILURE; } if (strstr( argv[1], "%d") == NULL) { fprintf(stderr, "Kein %%d in Argument 1\n", argv[1]); return EXIT_FAILURE; } for (i=1;i<argc-1;i++) { sprintf(neu, argv[1], i); // Dateinamen erzeugen if( (rename(argv[i+1],neu)) < 0) { fprintf(stderr, "Fehler beim Umbenennen von %s", argv[i+1]); // return EXIT_FAILURE; } else { printf("%s -> %s", argv[i+1], neu); } } return EXIT_SUCCESS; }
Ungetestet, dafür mit Sicherheitslücken.
-
Noch einfacher waere aber, du packst alle Dateien in ein Verzeichnis und durchlaeufst es dann. So brauchst du nicht alle Dateinamen auf der Kommando-zeile eingeben.
-
@: DirkB
hab es umgesetzt und fkt., danke!@gigg
wie kann man deine Idee umsetzten, denn ich weis nicht wie ich "dir" aufnehme und einzelne Files anspreche.Gruß,
Averroes
-
Averroes schrieb:
@gigg
wie kann man deine Idee umsetzten, denn ich weis nicht wie ich "dir" aufnehme und einzelne Files anspreche.Gruß,
AverroesSchau dir mal das Programm an, das ich verlinkt habe.
http://www.c-plusplus.net/forum/304449
Du arbeitest mit dirent.h
opendir(), readdir(), closedir() sind die Stichworte.Gruesse
-
Ich sehe gerade, dass dirent.h nur Linux/UNIX ist. Unter Windows
weiss ich es auch nicht.
-
@gigg, danke dir trotzdem
Weis es keiner wie ich den verlinkten Code im Windows realisieren kann
Gruß,
Averroes
-
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ß,
AverroesPS: 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 scopeGruß,
Averroes