GetCurrentTime() - Ein kleines Problem



  • Einfach nur aus demonstrativen Zwecken es soll ja kein fertiges Programm werden, sondern nur ein Prototyp ...

    Aber ich weiß nichts über Container 😕



  • hier oder hier

    die sind nicht nur extremst hilfreich sondern auch sehr wichtig weil sie flott sind und dir das gesamte leben ziemlich erleichtern



  • Jetzt bleib nur die Frage welche Container List, Maps oder multimaps
    Und füge ich einzelne Daten jeweils hinzu um sie Dann zu löschen ?



  • welcher container?!?

    da suchste dir einen aus und dann guckst du auf dem ersten link wie er benutzt wird...



  • Danke ^^!



  • void ShowFiles(const char *path,const char *files)
    {
      SetCurrentDirectory(path);
      WIN32_FIND_DATA fileData;
      HANDLE hFind = FindFirstFile(files, &fileData);
    
      list<WIN32_FIND_DATA> lLöschen;
      list<WIN32_FIND_DATA>::iterator i;
    
    long t1=0, t2 = 10;
        while ( true )
        {
            t2 = GetCurrentTime();
            if ( t2 >= t1+10 ) 
    		{
    
               if (hFind != INVALID_HANDLE_VALUE)
               {
    
                    do 
    	            {
                       if (fileData.dwFileAttributes & ~FILE_ATTRIBUTE_DIRECTORY)
                       { 
    
    					   lLöschen.push_back(fileData);
    					   for (i = lLöschen.begin() ;i != lLöschen.end(); i++)
    					   {
    						   remove(fileData.cFileName);
    	                   }
    				   }
                    } while (FindNextFile(hFind, &fileData));
    
    		   t1 = GetCurrentTime();
           }
    
        }
     }
    }
    

    Ich glaube ich bin einfach zu doof dafür 😕

    Edit: Jetzt löscht es am Anfang die Dateien aber man kann gar keine Dateien mehr in diesem Ordner erstellen!!



  • nein er meint das etwas anders mit dem im container speichern...

    du sollst erst per schleife den verzeichnis iterator durchgehen und jedes file in deinem container speichern(oder halt einen zeiger/referenz darauf) und danach sollst du alles was in diesem container ist löschen

    beim löschen von und mit iteratoren muss man etwas aufpassen, die können schnell ungültig werden



  • crashjosh schrieb:

    Ich glaube ich bin einfach zu doof dafür 😕

    Ach, ruhig bleiben. Du musst dein Problem (wie eigentlich immer) nur in kleinere Teilproblemchen teilen.

    Der Sinn, jede Sekunde eine Datei zu löschen, erschließt sich mir zwar nicht, aber du könntest am Anfang erst einmal eine Struktur definieren, die jederzeit (Dateigröße, Erstellungs-/Änderungs/(letzte Zugriffs)-Zeit) erweiterbar ist.

    struct FileInfo
    {
    	enum Type {DIR, FILE, INVALID};
    
    	FileInfo(const char* name, Type t) : filename(name),type(t) {};
    	FileInfo(const FileInfo& rhs)
    	{
    		*this=rhs;
    	}
    	~FileInfo() { }
    	FileInfo& operator=(const FileInfo& rhs)
    	{
    		filename = rhs.filename;
    		type=rhs.type;
    		return *this;
    	}
    
    	Type type;
    	string filename;
    };
    

    Dann eine Funktion schreiben, die das Verzeichnis einliest:

    bool GetDir(const char* name, vector<FileInfo>& v, bool subfolders = false)
    {
    	WIN32_FIND_DATA data;
    	string dir = name;
    	dir+="/*";
    	HANDLE hdl=FindFirstFile(dir.c_str(), &data);
    	if(hdl==INVALID_HANDLE_VALUE)
    		return false;
    	do
    	{
    		if(!((data.cFileName[0]=='.') && ( (data.cFileName[1]=='.' && data.cFileName[2]==0) || data.cFileName[1]==0)))
    		{ 
    			string path = name;
    			path+='\\';
    			path+=data.cFileName;
    			if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    			{
    				v.push_back(FileInfo(path.c_str(), FileInfo::DIR));
    				if(subfolders)
    				{
    					string dir = name;
    					dir+='\\';
    					dir+=data.cFileName;
    					GetDir(dir.c_str(), v, true); // rekursiv aufrufen
    				}
    			}
    			else
    			{
    				v.push_back(FileInfo(path.c_str(), FileInfo::FILE));
    			}
    		}
    	}while(FindNextFile(hdl,&data));
    
    	FindClose(hdl);
    	return true;
    }
    

    Somit kannst du alle Dateien eines Verzeichnisses (auch sämtlicher Unterverzeichnisse) in Erfahrung bringen, sortieren, löschen, ausführen etc..

    Ich habe eine ähnliche FileInfo-Klasse, musste diese jedoch aus nachvollziehbaren Gründen kürzen.



  • Danke für den ausfürhlichen Code!!
    Welche Paramter kommen denn bei GetDir("C:\*",...,...) noch rein ?



  • const char* dir = /* Verzeichnis*/ ;
    std::vector<FileInfo> files;
    GetDir(dir,files, false); // der letzte Parameter entscheided darüber, ob das Vereichnis komplett eingelesen werden soll
    for(vector<FileInfo>::const_iterator i=files.begin(),end=files.end();i!=end;++i)
    {
    	cout << i->filename << endl;
    }
    


  • #include <iostream>
    #include <string>
    #include <Windows.h>
    #include <list>
    #include <vector>
    
    using namespace std;
    
    struct FileInfo
    {
        enum Type {DIR, FILE, INVALID};
    
        FileInfo(const char* name, Type t) : filename(name),type(t) {};
        FileInfo(const FileInfo& rhs)
        {
            *this=rhs;
        }
        ~FileInfo() { }
        FileInfo& operator=(const FileInfo& rhs)
        {
            filename = rhs.filename;
            type=rhs.type;
            return *this;
        }
    
        Type type;
        string filename;
    };
    
    	bool GetDir(const char* name, vector<FileInfo>& v, bool subfolders = false)
    {
    
        WIN32_FIND_DATA data;
        string dir = name;
        dir+="/*";
        HANDLE hdl=FindFirstFile(dir.c_str(), &data);
        if(hdl==INVALID_HANDLE_VALUE)
            return false;
        do
        {
            if(!((data.cFileName[0]=='.') && ( (data.cFileName[1]=='.' && data.cFileName[2]==0) || data.cFileName[1]==0)))
            {
                string path = name;
                path+='\\';
                path+=data.cFileName;
                if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    v.push_back(FileInfo(path.c_str(), FileInfo::DIR));
                    if(subfolders)
                    {
                        string dir = name;
                        dir+='\\';
                        dir+=data.cFileName;
                        GetDir(dir.c_str(), v, true); // rekursiv aufrufen
                    }
                }
                else
                {
                    v.push_back(FileInfo(path.c_str(), FileInfo::FILE));
                }
            }
        }while(FindNextFile(hdl,&data));
    
        FindClose(hdl);
        return true;
    }
    
    int main()
    {
      vector<FileInfo> files;
      GetDir("C:\\Josh\\kaka",files,false);
      for(vector<FileInfo>::const_iterator i=files.begin(),end=files.end();i!=end;++i)
    {
        cout << i->filename << endl;
    } 
      return 0;
    
    }
    

    Leider beendet sich das programm von selbst ^^
    ich hab sehr warscheinlich einen Fehler gemacht aber das lerner ich noch 😛


Anmelden zum Antworten