Veröffentlicht 18. Oktober 200717 j Hallo Leute :-) Ich habe ein Problem der Code funktionert soweit sogut. aber ich möchte das file nicht manuell umbenennen sondern, dass automatisch das Erstellungdatum von der Datei angehängt wir als dateiname (JahrDatumZeit_alterfilename.datentyp) . kann mir bitte jemand helfen, weil ich brauch das Programm echt dringent. Bsp: bla.jpg -> 200611011703_bla.jpg #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <string.h> #include <windows.h> #include <time.h> #include <iostream.h> #define MAX 20 char *my_itoa(int wert, int laenge) { char *ret =(char *) malloc(laenge+1 * sizeof(char)); int i; for(i =0; i < laenge; i++) { ret[laenge-i-1] = (wert % 10) + 48; wert = wert / 10; } ret[laenge]='\0'; return ret; } int main(int argc, char *argv[]) { DIR *dip; struct dirent *dit; int i = 0, pos = 0, len,x=1; char path[MAX]/* = "/alanya"*/, c, prefix[MAX], end[MAX], neu[MAX]; printf("\n ----- rename 0.2 -----"); printf("\n\n / -> root der aktuellen Partition\nauf der die Datei ausgefuehrt wird.\n\n"); printf("Verzeichnis:\n> "); fflush(stdin); gets(path); // Bösse // SYSTEMTIME systime; // FILETIME ftime; // GetSystemTime(&systime); // SystemTimeToFileTime(&systime,&ftime); // *(ULONGLONG*)&ftime+=24*60*40*1000000*10; // FileTimeToSystemTime(&ftime,&systime); // SetSystemTime(&systime); printf("Prefix:\n> "); fflush(stdin); gets(prefix); printf("Dateiendung:\n> "); fflush(stdin); gets(end); if((dip = opendir(path)) == NULL) { printf("fehler beim oeffnen des verzeichnisses\n\n"); return 0; } else { while((dit = readdir(dip)) != NULL) { if(strcmp(dit->d_name, ".") != 0 && strcmp(dit->d_name, "..") != 0) { strcpy(neu,prefix); strcat(neu, my_itoa(x,5)); strcat(neu, end); printf("%s\n",neu); x++; printf("%s\n", dit->d_name); rename(dit->d_name,neu); } } } if(closedir(dip) == -1) { printf("fehler beim schliessen des verzeichnisses\n\n"); return 0; } printf("\n\n"); system("PAUSE"); return 0; }
18. Oktober 200717 j Das hat jetzt nicht direkt mit deiner Frage zu tun, aber du hast da ein Speicherleck. Der Speicher, den du in my_itoa mit malloc anforderst, gibst du nirgendwo wieder frei. Und warum stellst du den neuen Dateinamen nicht einfach auf einen Rutsch mit einer sprintf-Anweisung zusammen? Bist du da eigentlich unter Windows oder unter Unix/Linux zu Gange? P.S.: - gets ist böse, weil du keine Möglichkeit hast, einen Pufferüberlauf zu verhindern. - fflush(stdin) bewirkt undefiniertes Verhalten. - system("PAUSE") ist suboptimal.
18. Oktober 200717 j - fflush(stdin) bewirkt undefiniertes Verhalten. Nicht unter Windows, da löscht es den Eingabepuffer
18. Oktober 200717 j danke erstmal für die vielen hinweise ich arbeite unter windows xp und benutze bloodsheld dev c++. mm wiess aber nicht genau wie einbauen. so dass die dateien im Ordner alle nach ihrem erstellungsdatum umbennent werden, kurz mom kann ich einfach einen neuen namen geben und der alte wird mit _angebunden. Wenn jemand eine solches Porgramm mit ansi c oder c++ hätte wäre ich auch glücklich zahle auch gerne 45.- euro per paypal oder so, da ich dies echt dringent brauche. (mit quelldatei usw. für eventuelle zusätze , CLI)
18. Oktober 200717 j Hi, Nicht unter Windows, da löscht es den Eingabepuffer Quelle? Laut Standard ist das falsch, sowohl unter Linux als auch unter Windows.
18. Oktober 200717 j Steht auch irgendwo in der MSDN bzw. Knowledge Base. Der C Standard ist ja nur der kleinste gemeinsame Nenner an den sich alle halten müssen (sollten). Das heißt ja nicht das wenn da etwas offen (undefiniert) bleibt es nicht je nach Kompiler oder Betriebssystem verschiedene Wirkungsweisen geben kann. Das heißt es ja leider nichtmal bei im Standard fest definierten Dingen.
18. Oktober 200717 j Quelle? fflush (CRT) Da steht: If the stream is open for input, fflush clears the contents of the buffer. [...] // fflush on input stream is an extension to the C standard
18. Oktober 200717 j Wenn jemand eine solches Porgramm mit ansi c oder c++ hätte wäre ich auch glücklich In Standard-C bzw. -C++ wird das nicht machbar sein, weil beide weder Verzeichnisse durchsuchen noch das Erstellungsdatum einer Datei ermitteln können. Ein halbwegs portables C++-Programm könntest du mit boost::filesystem hinbekommen. Ansonsten wirst du dich wohl entweder auf POSIX oder WinAPI festlegen müssen.
18. Oktober 200717 j ehm kann mir jetzt bitte jemand helfen bittte!^^ Du bist am Zug. Du musst dich entscheiden: - boost::filesystem - POSIX - WinAPI Das heißt, wenn du überhaupt noch daran interessiert bist, das selbst zu machen. Ansonsten wirst du wohl warten müssen, bis sich jemand findet, der das für dich macht.
19. Oktober 200717 j hallo ja möchte es schon gerne selber machen aber brauch ja nur noch den code abschnitt das mir datum als name setz. besten mit WinAPI.
19. Oktober 200717 j - Verzeichnis durchsuchen (FindFirstFile/FindNextFile) - Umwandeln von FILETIME in SYSTEMTIME (FileTimeToSystemTime) - In String formatieren (sprintf) - Umbenennen (rename) Bei welchem Schritt hakt's denn?
19. Oktober 200717 j - Umwandeln von FILETIME in SYSTEMTIME (FileTimeToSystemTime) - In String formatieren (sprintf) bei den zwei wenn du den code anschust kannst du alle files rauslesen und umbennennen aber umbennennen geht nur mit einer manuellen name vergabe. das soll soll autoamtisch erstelldatum als namen schreiben.
19. Oktober 200717 j - Umwandeln von FILETIME in SYSTEMTIME // wfd ist deine WIN32_FIND_DATA-Struktur SYSTEMTIME st; FileTimeToSystemTime( &wfd.ftCreationTime, &st ); [/code] - In String formatieren (sprintf)[code] sprintf( neu, "%04d%02d%02d%02d%02d_%s", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, wfd.cFileName );
23. Oktober 200717 j Hej danke vielmals für die hilfe bis hierher, war leider 4 tage krank musste grippe auskurrieren. habe diesen code in eine neuem Projekt versucht dort geht es einwandfrei aber bei mir im code funkt es ned kanst du es ev mal in den code schreiben wäre dir dankbar, ev mache ich was falsch.
23. Oktober 200717 j kanst du es ev mal in den code schreibenNein, ich werde nicht deine Arbeit machen. bei mir im code funkt es nedGlaubst du, mit dieser Fehlerbeschreibung kann dir irgendjemand helfen?
23. Oktober 200717 j das kommt als ausgabe #warning This file includes at least one deprecated or antiquated header. \ Please consider using one of the 32 headers found in section 17.4.1.2 of the \ C++ standard. Examples include substituting the <X> header for the <X.h> \ header for C++ includes, or <iostream> instead of the deprecated header \ <iostream.h>. To disable this warning use -Wno-deprecated. Coppermine Photo Gallery - neues Album/untitled
23. Oktober 200717 j das kommt als ausgabeUnd das ist eine Warnung, kein Fehler. Da steht sogar, was das Problem ist, wie du es vermutlich beheben kannst, oder wie du die Warnung abschaltest (wovon ich abrate). Zeig doch mal die Zeile, die die Warnung verursacht.
23. Oktober 200717 j also der compiler startet das programm nicht. von dem her gehe ich aus das ein fehler ist. printf("\n ----- rename 0.2 -----"); printf("\n\n / -> root der aktuellen Partition\nauf der die Datei ausgefuehrt wird.\n\n"); printf("Verzeichnis:\n> "); fflush(stdin); gets(path); SYSTEMTIME st; FileTimeToSystemTime( &wfd.ftCreationTime, &st ); sprintf( neu, "%04d%02d%02d%02d%02d_%s", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, wfd.cFileName ); // Bösse ----- test zweck // SYSTEMTIME systime; // FILETIME ftime; // GetSystemTime(&systime); // SystemTimeToFileTime(&systime,&ftime); // *(ULONGLONG*)&ftime+=24*60*40*1000000*10; // FileTimeToSystemTime(&ftime,&systime); // SetSystemTime(&systime); //--------------------------- //printf("Prefix:\n> "); //fflush(stdin); //gets(prefix); wird ersetz durch //SYSTEMTIME st; //FileTimeToSystemTime( &wfd.ftCreationTime, &st ); //sprintf( neu, "%04d%02d%02d%02d%02d_%s", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, wfd.cFileName ); printf("Dateiendung:\n> "); fflush(stdin); gets(end); if((dip = opendir(path)) == NULL) { printf("fehler beim oeffnen des verzeichnisses\n\n"); return 0; } else { while((dit = readdir(dip)) != NULL) { if(strcmp(dit->d_name, ".") != 0 && strcmp(dit->d_name, "..") != 0)
23. Oktober 200717 j also der compiler startet das programm nicht. von dem her gehe ich aus das ein fehler ist.Es ist gar nicht Aufgabe des Compilers, das Programm zu starten. Er soll es nur übersetzen. Das entscheidende ist übrigens nicht die Warnung, die du hier gepostet hast, sondern die Fehler danach, die leider nur im Screenshot zu sehen sind. Warum verwendest du eigentlich immer noch opendir/readdir? Ich dachte, du wolltest die WinAPI benutzen? Mein Code geht davon aus, dass du FindFirstFile/FindNextFile benutzt. Du kannst meinen Code nicht einfach irgendwo in deinen reinklatschen. Ein wenig Mitdenken wäre schon angebracht. Ich schrieb doch: // wfd ist deine WIN32_FIND_DATA-Struktur [/code]
23. Oktober 200717 j ok tut mir leid wusste ich nicht dachte geht auch so, gibt ja so viele stanarts.... bin immer vom oberen code ausgegagen wo ich am anfang gepostet habe. mmm wie müsste es dann machen?
23. Oktober 200717 j Hol dir mit stat die Zeit für jede gefundene Datei und wandle sie mit localtime in struct tm um. Den sprintf-Aufruf musst du dann auch entsprechend anpassen.
23. Oktober 200717 j habe ich ja auch schon gemacht siehe bösse.Unter "bösse" (was soll das eigentlich heißen? Meinst du "böse"?) benutzt du weder stat noch localtime. Ich sehe da nur auskommentierten WinAPI-Code. klappte auch nicht.Ja, das ist auch eine tolle Fehlerbeschreibung
23. Oktober 200717 j *gg* merk schon wilst mich auch auskitzeln. mm also wie meinst du das? ich habe es soweit gebracht, dass das jahr rauskommt aber es setzt es nicht als name. bzw. habe dir noch eine nachricht geschickt *zwinker*
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.