GetCurrentTime() - Ein kleines Problem
-
Skym0sh0 schrieb:
java ist eigentlich nicht schlecht, weil da übernehmen andere das denken, z.b. die java entwickler und daraus resultierend die compiler/runtime-environments und so
Naja, manche Leute halten Java gerade deswegen für schlecht

Skym0sh0 schrieb:
find ich irgendwo doof wenn man jetzt total ineffezienten programmcode schreibt und der so vom compiler optimiert und heruntergebrochen wird, dass der byte code nach ein paar jahren schneller läuft als jedes C/C++ programm
Ich glaube, du machst dir unnötige Sorgen. Zudem muss man auch in Java etwas können, obwohl die Sprache es natürlich leichter als C++ macht, mit wenig Wissen was zustande zu bringen. Für qualitativ hochwertige Software braucht es aber auch hier einiges an Erfahrung...
-
So ich habe mich jetzt mal an einem Programm versucht (mit wenigen euer Codestücke)
Aber es macht nicht ganz was es soll-.-
Es soll kontinuirlich im 1-Sekunden-Takt Daten aus einem bestimmten Ordner löschen und man soll bestätigen das man die Datei löscht.Aber es löscht nur bei Programmstart die Dateien und fragt auch wenn die Datei schon gelöscht wurde immer wieder ob man die Datei löschen will
Hier der Code:void ShowFiles(const char *path,const char *files) { SetCurrentDirectory(path); WIN32_FIND_DATA fileData; HANDLE hFind = FindFirstFile(files, &fileData); long t1=0, t2 = 1000; while ( true ) { t2 = GetCurrentTime(); if ( t2 >= t1+1000 ) { if (hFind != INVALID_HANDLE_VALUE) { do { if (fileData.dwFileAttributes & ~FILE_ATTRIBUTE_DIRECTORY) { cout << "M"<<char(148)<<"chten sie wirklich die Datei " << fileData.cFileName << " L"<<char(148)<<"schen?" << endl; cin.get(); remove(fileData.cFileName); cout << "Datei wurde gelöscht!" << endl; } } while (FindNextFile(hFind, &fileData)); } t1 = GetCurrentTime(); } } }
-
Bist du sicher, dass FindNextFile noch korrekt arbeitet, wenn die Datei, von der die Suche fortgesetzt werden soll, gelöscht wurde?
-
Ach mist ^^
aber ich habe keine ahnung wie ich das bewerkstelligen soll ...
-
Ich kenne mich mit FindFirstFile und FindNextFile auch nicht so aus.
Aber du könntest z. B. erst mit den beiden Funktionen alle Dateinamen bzw. -pfade sammeln, in einem Container speichern und erst danach den Container durchgehen und die einzelnen Datei löschen und das Löschen vom Anwender bestätigen lassen.
-
Was du da machst ist nicht gerade CPU-schonend. Wozu willst du überhaupt so lange warten? Soll der Programmierer das Gefühl bekommen, dass deine Funktion viel arbeitet?
-
Einfach nur aus demonstrativen Zwecken es soll ja kein fertiges Programm werden, sondern nur ein Prototyp ...
Aber ich weiß nichts über Container

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