Sharpy Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 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; } Zitieren
Klotzkopp Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 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. Zitieren
Guybrush Threepwood Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 - fflush(stdin) bewirkt undefiniertes Verhalten. Nicht unter Windows, da löscht es den Eingabepuffer Zitieren
Sharpy Geschrieben 18. Oktober 2007 Autor Geschrieben 18. Oktober 2007 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) Zitieren
carstenj Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 Hi, Nicht unter Windows, da löscht es den Eingabepuffer Quelle? Laut Standard ist das falsch, sowohl unter Linux als auch unter Windows. Zitieren
Guybrush Threepwood Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 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. Zitieren
Klotzkopp Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 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 Zitieren
Klotzkopp Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 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. Zitieren
Sharpy Geschrieben 18. Oktober 2007 Autor Geschrieben 18. Oktober 2007 ehm kann mir jetzt bitte jemand helfen bittte!^^ Zitieren
Klotzkopp Geschrieben 18. Oktober 2007 Geschrieben 18. Oktober 2007 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. Zitieren
Sharpy Geschrieben 19. Oktober 2007 Autor Geschrieben 19. Oktober 2007 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. Zitieren
Klotzkopp Geschrieben 19. Oktober 2007 Geschrieben 19. Oktober 2007 - Verzeichnis durchsuchen (FindFirstFile/FindNextFile) - Umwandeln von FILETIME in SYSTEMTIME (FileTimeToSystemTime) - In String formatieren (sprintf) - Umbenennen (rename) Bei welchem Schritt hakt's denn? Zitieren
Sharpy Geschrieben 19. Oktober 2007 Autor Geschrieben 19. Oktober 2007 - 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. Zitieren
Klotzkopp Geschrieben 19. Oktober 2007 Geschrieben 19. Oktober 2007 - 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 ); Zitieren
Sharpy Geschrieben 23. Oktober 2007 Autor Geschrieben 23. Oktober 2007 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. Zitieren
Klotzkopp Geschrieben 23. Oktober 2007 Geschrieben 23. Oktober 2007 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? Zitieren
Sharpy Geschrieben 23. Oktober 2007 Autor Geschrieben 23. Oktober 2007 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 Zitieren
Klotzkopp Geschrieben 23. Oktober 2007 Geschrieben 23. Oktober 2007 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. Zitieren
Sharpy Geschrieben 23. Oktober 2007 Autor Geschrieben 23. Oktober 2007 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) Zitieren
Klotzkopp Geschrieben 23. Oktober 2007 Geschrieben 23. Oktober 2007 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] Zitieren
Sharpy Geschrieben 23. Oktober 2007 Autor Geschrieben 23. Oktober 2007 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? Zitieren
Klotzkopp Geschrieben 23. Oktober 2007 Geschrieben 23. Oktober 2007 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. Zitieren
Sharpy Geschrieben 23. Oktober 2007 Autor Geschrieben 23. Oktober 2007 habe ich ja auch schon gemacht siehe bösse. klappte auch nicht. Zitieren
Klotzkopp Geschrieben 23. Oktober 2007 Geschrieben 23. Oktober 2007 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 Zitieren
Sharpy Geschrieben 23. Oktober 2007 Autor Geschrieben 23. Oktober 2007 *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* Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.