von C++ aus batch aufrufen die files löscht die älter 14 Tage sind



  • Hallo Forenuser !!

    Vorweg ich habe lange in google gesucht und mir auch den Kopf zerbrochen aber ich steh jetzt leider auf der Leitung.

    Ich schreibe gerade ein C++ file, leider unter Windows mit Visual Studio C++ express. Aus diesem Quellcode soll ich in einem bestimmten Ordner alle Dateien löschen die älter als 14 Tage alt sind.

    Unter Unix hätte ich es schon gehabt. Ich kann auch keine Unix shell auf dem Windows Rechner installieren bzw. andere nützliche Tools die ich gefunden habe.(delage32...)

    Somit bleibt mir also nur ein C++ Programm oder ein .bat file.

    In C++ ist dies ganze sehr sehr umständlich hab ich festgestellt.
    Leider hab ich jetzt den Code nicht hier... also es könnte kleine Abweichungen geben.

    system( "date /T > date.txt" );
    ...pseudocode der erste Teil jetzt, funzt aber -> werds aber noch mit get_date() von der C++ Bib. auslesen
    char *date 
    fin >> date // ab hier hab ich dann das aktuelle Datum
    
    system("dir /b /O-D > dateBOD.txt");  // Nur Namen enthalten
    
    system("dir /O-D > dateBO");          // Datum + Namen enthalten
    

    /*hier hätte ich eigentlich alles aufgelistet. Nur wie soll ich in C++ ein Datum 14 Tage zurückrechnen ohne eine komplizierten Quellcode schreiben zu müssen ??
    Wenn es einfach geht dann hätte ich anschließend...

    while(fin.good())
    {
       // hier die Namen von dateBOD.txt einlesen und mit 
       system(" del Variable");  
       // die files gelöschen
    
    }
    

    da dies aber auch kürzer geht zumindest in UNIX sollte des doch hoff ich in Windows auch gehen.

    Hab folgendes gefunden aber ich verstehs ned so ganz.

    // Die schreiben in eine Excel Datei spalten mit Datum rein
    // ich find das hier aber keine schöne Lösung -> weil eben eine Excel Datei
    // auch noch dabei ist, außerdem ist auf dem System kein Excel installiert.
    // soll es auch nicht wenn möglich

    ::----snipp lösche alle daten von vorgestern.bat 
    
    //ok for verstanden 
    // /f ?? 
    // token er nimmt 2 zeichen 
    // delims=; ??
    // %%i ist variable ok
    // findstr "^.."  was ist ^ ?? 
    // geht des ganze hier drunter nicht einfachen ?? bzw. hat der consolen befehl // date nicht noch andere Attribute wie bei UNIX ?? 
    for /f "tokens=2 delims=;" %%i in ('findstr "^%date%" "c:\temp1\heutUndGestern.csv"') do @set "gestern=%%i" 
    
    for /R "d:\" %%i in (*.*) do @echo %%~ti|find "%date%"||@echo %%~ti|find "%gestern%"||@ECHO del /y "%%~dpnxi" 
    
    for /D %%i in (d:\*.*) do @echo %%~ti|find "%date%"||@echo %%~ti|find "%gestern%"||@ECHO rd /s /q "%%i"
    

    Falls ihr jetzt nicht wisst was ich benötige !!
    Entweder Tipps für eine Batch file das die Dateien löscht die älter als 14 Tage sind.
    Oder einen Tipp wie man Datums berechnungen macht!!

    Ihr müsst hier keinen vollständigen Quellcode schreiben.

    In C++ ist mir jetzt gerade ein kleiner Lichtblick eingefallen.
    Ich berechne das Datum auf Tage zurück.
    Ein Monat* 30 Tage + Tag im Monat = gesamt Tage im Jahr

    Dann könnt mit int Variablen arbeiten und ca. 14 Tage einhalten.
    Dies soll jetzt aber nicht heissen mein Problem hat sich in Luft aufgelöst !!
    So a Batch file wär scho cool wenn ich des schaffen würd.

    Viele Dank an jeden der mir hilft !!!



  • Hi!

    Das könnte dich interessieren:
    http://www.mcseboard.de/windows-forum-allgemein-28/mittels-powershell-dateien-bestimmtem-datum-loeschen-104512.html

    Ansonsten kannst du Datumsberechnungen mit den in der time.h deklarierten Funktionen machen. Für die Zeitdifferenz z.B. ist die Funktion difftime ganz brauchbar.
    http://www.cplusplus.com/reference/clibrary/ctime/difftime/

    Auf Batchdateien würde ich verzichten. Du kannst dir mit dirent.h
    http://en.wikipedia.org/wiki/Dirent.h
    fstat, stat etc. etwas halbwegs portables bauen.

    Gruß,
    B.B.



  • Wie du wahrscheinlich schon festgestellt hast gibt es da zwischen den einzelnen Windows-Versionen Unterschiede 😡

    Hier mal ein Überblick zur Shell unter Linux und Windows:
    http://de.wikipedia.org/wiki/Windows_PowerShell

    Was auch gehen sollte: Wenn du sämtliche Möglichkeiten der Batch nutzt, könnte das nur mit Batch realisiert werden.

    Einfacher ist wahrscheinlich, wenn du in C++ das aktuelle Datum abfragst, die 14 Tage berücksichtigst und eine Batch mit entsprechender Argumentenübergabe startest.

    Aber da sollten mehrere Wege nach Rom führen 😉

    MfG f.-th.





  • Danke vorerst für die tollen Tipps von euch beiden !!

    Werd jetzt erst mal Zeit brauchen das zu verarbeiten : )
    meld mich dann !!



  • P.S. P.S.
    Ich habe mir vorhin die dirent.h für Windows runtergeladen
    http://en.wikipedia.org/wiki/Dirent.h
    ganz unten ist der Link für die Windows Bibliothek.

    Alle Dateinamen eines Ordners bekommst du so:

    DIR *dp = NULL;  
    	struct dirent *ep = NULL; 
    
    	if ( NULL == ( dp = opendir("C:\\")))
    		return 1;
    
    	while ( ep = readdir ( dp ))
    	{ 
    		if ( "." == ep->d_name || ".." == ep->d_name )
    			continue;
    		cout << ep->d_name << endl; // Nur mal so zum Gucken.
    		// Hier mit fstat arbeiten.
    		// Das Erstellungsdatum ist im member st_ctime gespeichert.
    // http://msdn.microsoft.com/en-us/library/aa246905(VS.60).aspx
    
    	}
    	closedir(dp);
    

    Das sollte halbwegs portabel sein, wenn du die zugehörigen Bibliotheken hast.
    Die Kommentare helfen dir, das Erstellungsdatum einer Datei zu bestimmen.
    Diesen Weg würde ich einer Batschlösung vorziehen.
    Gruß,
    B.B.


Anmelden zum Antworten