JPG's aus einem Ordner löschen die älter als X-tage sind



  • Hallo
    Ich habe ein Programm geschrieben, welches Bilder aufnimmt und in einem Ordner abspeichert.
    Ein anderes Programm liest den Ordner aus vergleicht das Erstelldatum mit der Systemzeit und zeigt mir die Differenz der Tage an. Nach einer gewissen Anzahl an Tagen in meinem Fall (28) bzw. zum probieren 3 Tage sollen diese gelöscht werden.
    Wenn ich diese Dateien, also den ganzen Pfad für ein Bild eingebe, einfach mit DeleteFile oder Remove lösche Funktioniert es.
    Da ich aber mehrere Bilder automatisch löschen möchte, nämlich alle die älter als x-Tage alt sind muss ich dem Pfad noch ein char übergeben (bzw. eine win32_find_data Datei + das file). Die Umsetzung Funktioniert irgendwie nicht...
    Ich habe in dem Code verschiedene Beispiele ausprobiert, also alles in ein string umwandeln oder ein Chat usw. und als Kommentar 1 bis Kommentar 7 mit im Code eingefügt.
    Ich habe ein Beispiel gefunden in dem die älteste Datei gelöscht wird aber dafür muss ich erstmal die dirent.h usw. einbinden... https://www.c-plusplus.net/forum/281514-full und wollte versuchen es auf meinem Weg zu schaffen...
    Vielleicht ist es ja eine ganz simple Sache die ich übersehen habe.
    Anscheinend habe ich da ein irgendwie einen Denkfehler.
    Ich hoffe irgendwer kann mir Helfen da ich nicht mehr weiter weiß 😞

    using namespace std;
    
    void OrdnerOEffnen();
    void TagLoeschen();
    
    // Return time difference in units of 100 us.
     _int64 Delta(const SYSTEMTIME st1, const SYSTEMTIME st2) {
      union timeunion 
      {
          FILETIME fileTime;
          ULARGE_INTEGER ul;
      }; 
    
      timeunion ft1;
      timeunion ft2;
    
      SystemTimeToFileTime(&st1, &ft1.fileTime);
      SystemTimeToFileTime(&st2, &ft2.fileTime);
    
      return ft2.ul.QuadPart - ft1.ul.QuadPart;
    }
    
    int main (void)
    {
    	OrdnerOEffnen();
    	TagLoeschen();
    
    	cin.sync();
    	cin.get();
    	return 0;
    }
    
    // Auf Ordner wird zugegriffen und es wird der Dateiname, das Erstelldatum und die Anzahl angegeben
    void OrdnerOEffnen()
    {
    
     HANDLE firstHandle; 
     HANDLE search; 
     WIN32_FIND_DATA wfd;  
     char buf[MAX_PATH];  
     int FileCount = 0; 
    
     firstHandle=FindFirstFile("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\*",&wfd); 
     //search = FindFirstFile(buf, &wfd);
    
    do 
    { 
         // Eintrag nur behandeln, wenn es nicht . oder .. ist (werden nur bei Unterverzeichnissen mit zurückgeliefert) 
         // hier könnte man z.B. auch mit lstrcmp auf . und .. vergleichen, was allerdings nicht ganz so effizient ist 
         if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
         { 
             if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
             { 
                 cout<< "Folgendes Verzeichnis wurde gefunden:"<<wfd.cFileName << endl; 
             } 
             else 
             { 
    			 cout<< "\nDatei wurde gefunden:\n"<<wfd.cFileName <<  endl; 
             } 
             if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
    		 {
    		 }
    		 else 
             { 
                   FileCount ++; 
    
    					FILETIME test = wfd.ftLastWriteTime;
    					FILETIME aktuell;
    					SYSTEMTIME datum; 
    					SYSTEMTIME zeit;
    					FileTimeToSystemTime(&test, &datum);
    					FileTimeToSystemTime(&test, &zeit);
    					SYSTEMTIME testZeit;
    					GetLocalTime(&testZeit);
    
    							cout<< FileCount<<"." <<" Datei gefunden am :" << datum.wDay << "."<<datum.wMonth << "."<< datum.wYear<<"\n" <<
    							   "Uhrzeit:" <<zeit.wHour+2 <<":"<<zeit.wMinute <<":"<<zeit.wSecond << "Uhr"<< endl;
    
    							cout<< "Aktuells Datum: " << testZeit.wDay << "."<<testZeit.wMonth << "."<< testZeit.wYear<<"\n" <<
    							   "Uhrzeit:" <<testZeit.wHour <<":"<<testZeit.wMinute <<":"<<testZeit.wSecond << "Uhr"<< endl;
    
    					SystemTimeToFileTime(&testZeit, &aktuell);
    					_int64 diff = Delta(datum, testZeit);
    					_int64 diffDays = diff / 10 / 1000 / 1000 / 60 / 60 / 24;
    					cout<< "Differenz: " << diffDays  << endl;
    
    					if(diffDays >3)
    						{
    
    							//So löscht man genau das File was man ausgewählt hat
    							//DeleteFile ("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\12345666_20171006_113800_0.jpg");
    
    							//Versuch1
    							//std::string str ("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\*");
    							//std::string str = wfd;
    
    							//Versuch2
    							/*stringstream ss;
    							string s;
    							char wfd[] = ("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\");
    							ss << wfd;
    							ss >> s;
    							DeleteFile ("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\+ wfd.cFileName");
    			*/
    
    							//Versuch 3
    							/*char *wfd = "C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\";
    							char str[256];
    							sprintf (str,"C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\%s",wfd);
    							fopen (str,"C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\%s");*/
    
    							//Versuch 4
    							/*std::string fileName ="C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\";
    							std::wstring wFileName(fileName.begin(),fileName.end());
    							auto res = DeleteFile(wFileName.c_str());*/
    
    							//Versuch 5 keine passende Konvertierungsfunktion von "std::string" in LPCSTR vorhanden
    							/*std::string a= "C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\";
    							std::string b= "wfd";
    							std::string b= "cFileName";
    							std::string c = a+b;
    							DeleteFile (c);*/
    
    							//Versuch 6
    							/*string x = ( "C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\");
    							LPCSTR y = x.c_str();*/ 
    							//remove (("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\" + wfd).c_str());
    
    							//remove macht das selbe wie deletefile
    							//String* str1 = String::Concat( "C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\", "wfd.cFileName");
    							remove ("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\"+ wfd.cFileName);
    							DeleteFile ("C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\"+ wfd.cFileName);
    
    							cout<<"Datei aelter als 28 Tage und wurde geloescht"<<endl;
    
    						}
    						else
    							cout<<"Datei nicht aelter als 28 Tage"<<endl;
    			}
    		}	 
    	} 
    	while (FindNextFile(firstHandle,&wfd)); 
    		FindClose(firstHandle);
    	return ;
    }
    

  • Mod

    Bevor man mit dieser Lösung zu viel Zeit verschwendet, die Frage, ob du dies machst, um C++ zu lernen, oder ob es dir eher auf das Ergebnis ankommt. Denn das Ergebnis erreichst du viel einfacher mit wenigen Zeilen Shellscript. Google liefert mir sogar ein paar schöne Einzeiler.



  • Ich mache ein Pflichtpraktikum von der UNI aus und habe vorher nur Erfahrungen mit C und FPGA Programmierung gesammelt und hänge an dem Problem seit zwei Tagen... Also steht das Ergebnis im Vordergrund.
    Da es aber sicherlich nicht die letzte Aufgabe mit C++ für mich sein wird würde ich es gerne auch verstehen und lernen.
    Ich habe extrem viel gegoogelt und weiß nicht mehr in welche Richtung ich googlen soll 😃
    Shellscript sagt mir gar nichts aber würde mich natürlich auch interressieren ?!
    Grundegenomme muss ich doch für den Remove bzw. Deletebefehl das wfd.cFilename als string einbinden? Oder bin ich auf dem Holzweg?


  • Mod

    tobimobi schrieb:

    nd hänge an dem Problem seit zwei Tagen...

    Wow. Dann vergiss doch besser den Ansatz und mach's über die Shell. Die ist für so etwas vorgesehen.

    Ich habe extrem viel gegoogelt und weiß nicht mehr in welche Richtung ich googlen soll 😃

    Google: windows delete files older than
    War es so schwer, darauf zu kommen? Praktisch alle Treffer zeigen gleich mehrere mögliche Einzeiler.

    Dass du als Student solch einfache Googlesuchen nicht selbstständig durchführen kannst, ist erschreckend. Ich hoffe, du lügst einfach und hast gar nicht gesucht (Was aber auch schlecht ist, denn das sollte eigentlich der erste Schritt sein!). Falls du wirklich nicht selbstständig in der Lage warst, diese Suche durchzuführen, fehlt dir eine ganz grundlegende Fertigkeit, um in Studium und Beruf klar zu kommen und du solltest das schnellstens ändern.

    Vielleicht liegt auch ein XY-Problem vor: Du denkst, du willst Y (Dateien löschen, die ein gewisses Alter haben), aber hast dich so auf deinen Ansatz X versteift - der eventuell nicht einmal zielführend ist - dass du all deine Zeit und deine Suchen darauf verschwendest, den Ansatz X irgendwie zum Laufen zu bekommen, anstatt nach einer Lösung für Y zu suchen.



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich wollte das ganze in C++ lösen indem ich eine .exe erstell die einmal am Tag durchläuft welche die zu alten Bilder löscht und das für die nächste Jahre.
    Meine Googles suche fing immer mit c++ an vielleicht liegt es daran...
    Liegt wohl echt daran das ich zu engstirnig gesucht habe...
    Da mir nur noch eine Prüfung im Elektrotechnik Studium fehlt und ich nebenbei arbeite ignoriere ich das andere mal gekonnt 😃
    Trotzdem danke für die Antwort ich werde dann mal den einfachen Weg ausprobieren aus deinem link und danach mein Programm vielleicht noch erfolgreich zum laufen bekommen.



  • Das hier:

    //Versuch 5 keine passende Konvertierungsfunktion von "std::string" in LPCSTR vorhanden
                                /*std::string a= "C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\";
                                std::string b= "wfd";
                                std::string b= "cFileName";
                                std::string c = a+b;
                                DeleteFile (c);*/
    

    sieht doch gar nicht sooo schlecht aus ...

    Wie wärs denn mit (ungetestet):

    //Ordner mit den Dateien:
    std::string a= "C:\\LokaleDaten\\projekt kammera tobi\\AeltesteDateiImOrdnerLoeschen\\HierWerdenDieAeltestenDatenGeloeschtBEISPIELordner\\";
    //gefundener Dateiname:
    std::string b(wfd.cFileName);
    //zusammenbauen:
    std::string c = a+b;
    //File löschen:
    DeleteFile (c.c_str());
    


  • guck dir doch mal die funktionen findfirstfile, findnextfile und getfiletime an.



  • Wade1234 schrieb:

    guck dir doch mal die funktionen findfirstfile, findnextfile und getfiletime an.

    Guck Dir doch mal seinen Code an ...



  • Wie wäre es damit, einfach einen C-Zeichenarray zu verwenden? 😉

    TCHAR szFile[MAX_PATH];
    
    lstrcpy(szFile,"bla bla bla Verzeichnis\\");
    lstrcat(szFile,wfd.cFileName);
    
    DeleteFile(szFile);
    

    DeleteFile() ist nämlich keine C++-Funktion, sondern eine C-Funktion.



  • Danke für die weiteren Vorschläge 🙂
    Werde ich gleich mal alles austesten und gucken was mir am besten gefällt 🙂


Anmelden zum Antworten