Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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;

}

  

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.

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)

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.

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.

ehm kann mir jetzt bitte jemand helfen bittte!^^

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.

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.

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

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

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.

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

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)

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]

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?

habe ich ja auch schon gemacht siehe bösse. klappte auch nicht.

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:

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.