Ordner Überwachen



  • Hi Ihr C/C++ Profis. Ich habe folgenden Problem. Ich muss für ein Schulprojekt
    ein tool schreiben der eine Ordner überwacht und wenn eine neue Datei rein kommt eine meldung macht (z.B per MessageBox)

    Ihr würdet mir einen riesen gefall tun wenn mir jemanden ein lösungsforschlag machen könnten. Ich würde soger auch was bezahlen dafür. Bis 50 € würde ich dafür geben.



  • Johan schrieb:

    Hi Ihr C/C++ Profis. Ich habe folgenden Problem. Ich muss für ein Schulprojekt ein tool schreiben der eine Ordner überwacht und wenn eine neue Datei rein kommt eine meldung macht (z.B per MessageBox)

    da du messagebox sagst, geb ich dir meinen code, der winapi benutzt und verschiebe dann auch gleich den thtead nach mfc.

    #include <iostream>
    #include <windows.h>
    #include <map>
    #include <set>
    using namespace std;
    
    char const* getExtension(char const* fileName){
    	char const* result=fileName;
    	for(char const* pos=fileName;*pos!='\0';++pos)
    		if(*pos=='.')
    			result=pos+1;
    	return result;
    }
    
    map<string,FILETIME>* createSourceFileTimes(char const* path,set<string> const& sourceExtensions){
    	map<string,FILETIME>* fileTimes=new map<string,FILETIME>;
    	WIN32_FIND_DATA fd;
    	HANDLE hFF=FindFirstFile("*.*",&fd);
    	if(hFF!=INVALID_HANDLE_VALUE){
    		do{
    			if((fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0){
    				if(strcmp(fd.cFileName,"makefile")==0 || sourceExtensions.find(getExtension(fd.cFileName))!=sourceExtensions.end()){
    					(*fileTimes)[fd.cFileName]=fd.ftLastWriteTime;
    				}
    			}
    		}while(FindNextFile(hFF,&fd));
    		FindClose(hFF);
    	}
    	return fileTimes;
    }
    
    bool operator==(const FILETIME& a,const FILETIME& b){
    	return a.dwLowDateTime==b.dwLowDateTime && a.dwHighDateTime==b.dwHighDateTime;
    }
    
    int main(){
    	set<string> sourceExtensions;
    	sourceExtensions.insert("lang1");
    	sourceExtensions.insert("lang1h");
    
    	map<string,FILETIME> *oldTimes=createSourceFileTimes(".",sourceExtensions);
    		
    	HANDLE hFCN=FindFirstChangeNotification(".",FALSE,FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE);
    	for(;;){
    		WaitForSingleObject(hFCN,INFINITE);
    		do{
    			FindNextChangeNotification(hFCN);
    		}while(WaitForSingleObject(hFCN,100)==WAIT_OBJECT_0);
    		map<string,FILETIME> *newTimes=createSourceFileTimes(".",sourceExtensions);
    		if(!equal(oldTimes->begin(),oldTimes->end(),newTimes->begin())){
    			delete oldTimes;
    			oldTimes=newTimes;
    			system("make test");
    			cout<<"################################################################################"<<endl;
    		}
    	}
    }
    

    Ihr würdet mir einen riesen gefall tun wenn mir jemanden ein lösungsforschlag machen könnten. Ich würde soger auch was bezahlen dafür. Bis 50 € würde ich dafür geben.

    kauf die nächsten c++-bücher über links von diesem forum aus, dadurch kommt dann ne kleinigkeit rein, um marc++us von den serverkosten zu entlasten.



  • Vielleicht hilft Dir dnotify ja weiter...

    edit: Funktioniert natürlich nur unter Linux...
    Volkard: Das ist übrigens das Ding von dem ich beim Forumstreffen irgendwann geredet habe falls Du Dich noch erinnerst. 🙂



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum MFC mit dem Visual C++ verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • [quote="volkard"][quote="Johan"]Hi Ihr C/C++ Profis. Ich habe folgenden Problem. Ich muss für ein Schulprojekt ein tool schreiben der eine Ordner überwacht und wenn eine neue Datei rein kommt eine meldung macht (z.B per MessageBox)

    da du messagebox sagst, geb ich dir meinen code, der winapi benutzt und verschiebe dann auch gleich den thtead nach mfc.

    #include <iostream>
    #include <windows.h>
    #include <map>
    #include <set>
    using namespace std;
    
    char const* getExtension(char const* fileName){
    	char const* result=fileName;
    	for(char const* pos=fileName;*pos!='\0';++pos)
    		if(*pos=='.')
    			result=pos+1;
    	return result;
    }
    
    map<string,FILETIME>* createSourceFileTimes(char const* path,set<string> const& sourceExtensions){
    	map<string,FILETIME>* fileTimes=new map<string,FILETIME>;
    	WIN32_FIND_DATA fd;
    	HANDLE hFF=FindFirstFile("*.*",&fd);
    	if(hFF!=INVALID_HANDLE_VALUE){
    		do{
    			if((fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0){
    				if(strcmp(fd.cFileName,"makefile")==0 || sourceExtensions.find(getExtension(fd.cFileName))!=sourceExtensions.end()){
    					(*fileTimes)[fd.cFileName]=fd.ftLastWriteTime;
    				}
    			}
    		}while(FindNextFile(hFF,&fd));
    		FindClose(hFF);
    	}
    	return fileTimes;
    }
    
    bool operator==(const FILETIME& a,const FILETIME& b){
    	return a.dwLowDateTime==b.dwLowDateTime && a.dwHighDateTime==b.dwHighDateTime;
    }
    
    int main(){
    	set<string> sourceExtensions;
    	sourceExtensions.insert("lang1");
    	sourceExtensions.insert("lang1h");
    
    	map<string,FILETIME> *oldTimes=createSourceFileTimes(".",sourceExtensions);
    		
    	HANDLE hFCN=FindFirstChangeNotification(".",FALSE,FILE_NOTIFY_CHANGE_FILE_NAME|FILE_NOTIFY_CHANGE_LAST_WRITE);
    	for(;;){
    		WaitForSingleObject(hFCN,INFINITE);
    		do{
    			FindNextChangeNotification(hFCN);
    		}while(WaitForSingleObject(hFCN,100)==WAIT_OBJECT_0);
    		map<string,FILETIME> *newTimes=createSourceFileTimes(".",sourceExtensions);
    		if(!equal(oldTimes->begin(),oldTimes->end(),newTimes->begin())){
    			delete oldTimes;
    			oldTimes=newTimes;
    			system("make test");
    			cout<<"################################################################################"<<endl;
    		}
    	}
    }
    

    Kannst du vieleicht den quelcode ein wenig auskommentieren. es würde mir sehr weiter helfen
    Danke



  • du könntest den code auch einfach zeile für zeile durchackern, dann lernste dabei noch was über das verstehen fremden codes^^



  • Johan schrieb:

    Kannst du vieleicht den quelcode ein wenig auskommentieren. es würde mir sehr weiter helfen

    nein, mag ich nicht.
    ich denke, mit dem code habe ich viel mehr gehelft, als notwendig.
    die anpassung, daß es statt "system("make test");" lieber "MessageBox(NULL,"sich hat was geaendert","aenderungswachter",MB_OK)" macht und das lange if mit dem strcmp ersatzlos zu löschen, kannste selber schaffen. wenn nicht, biete nochmal 50Eu dafür an.



  • Eine frage noch kurz. wo wird der pfad des Ordners angegeben welche überwacht werden loss?
    Danke



  • Hm, wenn es ein Schulprojekt ist, sollte
    evtl. der Lehrer den Code auch verstehen können 😃 😉

    Devil



  • das ist ein schulprojekt aber den code müssen wir selber abliefern. was sol ich den lehrer den erzehlen wie ich den selber geschrieben wenn ich den code nicht selber verstehe. Es währe wirklich sehr hilfreich wenn mir jemanden den queltext ein wenig auskommentieren würde.
    thx.



  • HANDLE hFileChanged = FindFirstChangeNotification("c:\\mysql",TRUE,FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_SIZE);
    HANDLE hWaitEvents[] = { hFileChanged};
    DWORD dwResult = WaitForMultipleObjects(2, hWaitEvents,FALSE,INFINITE);
    

    Das wichtigste.
    Watet bis sich im Ordner c:\mysql etwas tur und geht dann weiter.
    Ambesten in einem Thread einbauen da man sonst die GUI sperrt und auch noch herausfinden muss welches file es ist.



  • die 2 in obigem code ist eine übungsaufgabe.
    lies immer brav die hilfe zu den funktionen und guck nach, ob die übergebenen parameter glaubwürdig sind. wenn nicht, korrigiere fehlerchen eigenständig.


Anmelden zum Antworten