Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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;

}

  

Geschrieben

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.

Geschrieben

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)

Geschrieben

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.

Geschrieben
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.

Geschrieben
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.

Geschrieben

- 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.

Geschrieben
- 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 );

Geschrieben

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.

Geschrieben

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

Geschrieben
das kommt als ausgabe
Und 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.

Geschrieben

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)

Geschrieben
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]

Geschrieben

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?

Geschrieben
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 :rolleyes:
Geschrieben

*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*

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...