Verzeichnissuche

Proggen.org - Lernprojekt: Duplikatefinder
Benutzeravatar
cloidnerux
Moderator
Beiträge: 3091
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Verzeichnissuche

Beitrag von cloidnerux » Mo Jun 21, 2010 8:21 pm

Ich kenne mich noch nicht sonderlich viel mit Cmake aus, reichte aber um mein Teil von Dedupe bisher in Cmake zu integrieren.
Du musst immer beachten, dass du in jedem unterordner wieder eine CmakeList datei brauchst, die angibt, welche Dateien dieses ordners gebraucht werden und welche Unterornder mit eingebunden werden soll.
Dann teilst du nur noch in der Übergeordneten CMakeList per add_subdirectory (@Kerli: was macht das include_directory?) cmake mit, diesen ordner auch zu benutzen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Verzeichnissuche

Beitrag von Kerli » Mo Jun 21, 2010 10:30 pm

Bebu hat geschrieben:Ich scheitere einfach daran, das ich mich mit Cmake nicht wirklich auskenne und immer einen Kompilerfehler bekomme, sobald ich das Unterverzeichnis mitbenutze. Darum wende ich mich ja an jemanden, der sich auskennt ;)
Ich werde mir das einmal anschauen :)

Falls du oder natürlich auch wer anders mehr zu CMake lernen möchte wäre zb hier oder hier ein guter Anfang.
cloidnerux hat geschrieben:@Kerli: was macht das include_directory?
Es fügt das/die angebene(n) Verzeichnis zum Includepfad hinzu. Das gleiche gibt es auch noch für den Linker mit 'link_directories'.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Verzeichnissuche

Beitrag von Bebu » Di Jun 22, 2010 2:23 am

So habe gerade eine neue Version hochgeladen, diesmal mit funktionierendem Buildsystem :D
Fragt mich lieber nicht, wie lange ich gebraucht habe und woran es letztlich gescheitert ist :evil:
Es klappt jetzt jedenfalls. Das ganze enthält jetzt auch einen Ordner für Windows, allerdings ist der Code dort drinnen noch nicht portiert, also keine falschen Hoffnungen :P
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Verzeichnissuche

Beitrag von Bebu » Mo Aug 02, 2010 6:18 pm

Hiermit mal eine kurze Rückmeldung zur Verzeichnissuche:
Im Hintergrund ist bisher einiges passiert, allerdings sind mir beim Codestil anpassen und Dokumentieren noch einige Ungereimtheiten aufgefallen. Die haben sich dann leider als nicht ganz so kleiner Designfehler entpuppt und so bin ich momentan dabei, die komplette Suchfunktion zu überarbeiten, was fast einem kompletten Neuschreiben gleichkommt. Ich muss euch also noch ein wenig vertrösten.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Verzeichnissuche

Beitrag von fat-lobyte » Mo Aug 02, 2010 9:57 pm

Bebu hat geschrieben:Im Hintergrund ist bisher einiges passiert,
Schade dass es nur im Hintergrund war... Du hättest deine Änderungen ruhig commiten können, zumindest in deinem eigenen Branch. Sind die anderen Entwickler nicht allzu unhöflich, solltest du dort deine Ruhe haben und keiner dir hineinpfuschen.

Wär auch von Vorteil,
1. als Backup, denn es kann wirklich schnell mal was in die Hose gehen (Befehl rm *~, Leerzeichen an der Falschen Stelle) und alle deine Änderungen sind weg.
2. damit das was du machst nachvollziehbar bleibt - auch wenn mal was nicht hinhaut sollte man die Änderungen trotzdem commiten (in den nächsten commits besserst du deine Fehler natürlich wieder aus). Man sollte immer irgendwie nachvollziehen können warum jemand etwas gemacht hat, und da eignet sich ein VCS mit seinen Änderungen und Commitmessages ziemlich gut dafür.
3. damit wir auch was zum schauen haben was sich bei dir so treibt ;-) - Ich glaube hier verurteilt keiner jemanden, weil er ein paar Fehler macht, aber es ist doch Spannend zuzuschauen wie die Leute denn so arbeiten. (Evtl. lernt man auch was dabei, denk ich mir zumindest ^^)
Also ruhig mal commiten, und ruhig mal öfter commiten auch wenns nicht funktioniert. (Natürlich nur auf persönliche- und Feature Branches, beim Trunk sollte man etwas vorsichtiger sein).

allerdings sind mir beim Codestil anpassen und Dokumentieren noch einige Ungereimtheiten aufgefallen. Die haben sich dann leider als nicht ganz so kleiner Designfehler entpuppt und so bin ich momentan dabei, die komplette Suchfunktion zu überarbeiten, was fast einem kompletten Neuschreiben gleichkommt.
Sehr schön, unter anderem dafür sind die Richtlinien auch da :-)
Ich muss euch also noch ein wenig vertrösten.
Gerüchte besagen, die GUI könnte etwas länger dauern. Ich will nicht sagen "lass dir Zeit", aber schlechtes Gewissen solltest du auch keines haben ;-)
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Verzeichnissuche

Beitrag von Bebu » Di Aug 03, 2010 7:40 pm

fat-lobyte hat geschrieben: Schade dass es nur im Hintergrund war... Du hättest deine Änderungen ruhig commiten können, zumindest in deinem eigenen Branch. Sind die anderen Entwickler nicht allzu unhöflich, solltest du dort deine Ruhe haben und keiner dir hineinpfuschen.
Keine Sorge, ist mittlerweile passiert, du kannst also nach Herzenslust in meinem Brunch rumwühlen^^ Du brauchst dafür nur Linux, die Windowsversion hab ich noch nicht mal angefangen :twisted:
fat-lobyte hat geschrieben: Wär auch von Vorteil,
1. als Backup, denn es kann wirklich schnell mal was in die Hose gehen (Befehl rm *~, Leerzeichen an der Falschen Stelle) und alle deine Änderungen sind weg.
2. damit das was du machst nachvollziehbar bleibt - auch wenn mal was nicht hinhaut sollte man die Änderungen trotzdem commiten (in den nächsten commits besserst du deine Fehler natürlich wieder aus). Man sollte immer irgendwie nachvollziehen können warum jemand etwas gemacht hat, und da eignet sich ein VCS mit seinen Änderungen und Commitmessages ziemlich gut dafür.
3. damit wir auch was zum schauen haben was sich bei dir so treibt ;-) - Ich glaube hier verurteilt keiner jemanden, weil er ein paar Fehler macht, aber es ist doch Spannend zuzuschauen wie die Leute denn so arbeiten. (Evtl. lernt man auch was dabei, denk ich mir zumindest ^^)
Also ruhig mal commiten, und ruhig mal öfter commiten auch wenns nicht funktioniert. (Natürlich nur auf persönliche- und Feature Branches, beim Trunk sollte man etwas vorsichtiger sein).
Gebe dir da vollkommen Recht, ich wollte nur keine absolute Baustelle hochladen, in der außer ein paar einzelnen Funktionen gerade nichts funktioniert hat. Ich hatte nicht viel Zeit und so war es eine Dauerbaustelle ^^
fat-lobyte hat geschrieben:Gerüchte besagen, die GUI könnte etwas länger dauern. Ich will nicht sagen "lass dir Zeit", aber schlechtes Gewissen solltest du auch keines haben ;-)
Zeit lassen wäre eine schlechte Idee, aber ich arbeite eh nur daran, wenn ich Zeit und Lust habe. Aber ein bisschen schlechtes Gewissen hilft weiterzumachen :mrgreen:
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Verzeichnissuche

Beitrag von fat-lobyte » Di Aug 03, 2010 9:45 pm

Bebu hat geschrieben:du kannst also nach Herzenslust in meinem Brunch rumwühlen^^
Mmmhh, lecker. Ich wühle gerne in anderer Leute Essen rum ;-)
Bebu hat geschrieben:Du brauchst dafür nur Linux, die Windowsversion hab ich noch nicht mal angefangen :twisted:
Frage ab den/die Projektmanager: vielleicht wäre es nicht so schlecht die POSIX-Version erstmal halbwegs funktionierend zu machen und in den Trunk zu mergen und dann erst mit der WinAPI-Version anzufangen?
Bebu hat geschrieben:Gebe dir da vollkommen Recht, ich wollte nur keine absolute Baustelle hochladen, in der außer ein paar einzelnen Funktionen gerade nichts funktioniert hat. Ich hatte nicht viel Zeit und so war es eine Dauerbaustelle ^^
Ist das nicht normal? Wo wenn nicht auf einer Baustelle baut man Gebäude? :-) Wie gesagt, der Trunk sollte einigermaßen sauber bleiben, aber die Branches sind genau der Platz für Baustellen.
Wichtig ist einfach, dass keiner Angst vor Commits hat. Das ist etwas was mir an Subversion nicht gefällt, da sind Commits zu einschüchternd gestaltet (hilfe, da brauch ich ja wieder Internet, das wird ja auf den Server hochgeladen, das steigert die Commitnummer, ...) was ich für den Falschen Weg halte. Ich bin mehr Fan der Philosophie Commit early, Commit often die Gründe kann man in diesem Lesenswerten Artikel nachlesen: http://blog.red-bean.com/sussman/?p=96 . Mit etwas cooleren Versionsverwaltungssystemen könnte man dann nämlich lustige Dinge anstellen.
Hier wird Xin vielleicht anderer Meinung sein?

Ich versuch mir mal deinen Code anzuschauen. Wenn gewünscht gibts dann Feedback (aber nicht vergessen, bin auch nur ein Mensch und brauch Zeit zum nachvollziehen ^^)
Haters gonna hate, potatoes gonna potate.

Benutzeravatar
Bebu
Beiträge: 562
Registriert: Mi Okt 21, 2009 6:19 pm
Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!

Re: Verzeichnissuche

Beitrag von Bebu » Di Aug 03, 2010 10:17 pm

Du kannst da gerne reinschauen, der wirklich relevante Teil ist aber gerade auskommentiert, weil noch nicht überarbeitet. Für mich nimmt dieses Modul immer größere Züge an, das Ding wird langsam zu einem Framework ;) Aber solange ich noch selber den Überblick behalte, gehts noch.

Habe dir auch noch den heutigen Arbeitsstand hochgeladen. Bitte bei der Funktion File::Search nicht zu genau schauen, das ist meine aktuelle Baustelle und der aktuelle Lösungsansatz gefällt mir so noch nicht.
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8502
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Verzeichnissuche

Beitrag von Xin » So Aug 08, 2010 6:30 pm

Wie sieht es denn aus mit dem Framework?

Momentan verabschiedet es sich bei mir in einer Endlosschleife. (Er findet das Verzeichnis '.' und dann hakts).
Ich würde es gerne verwenden, um den Inhalt eines Verzeichnisses auszulesen. Die NCurses-Version braucht schließlich auch einen Datei-Browser.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2448
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Verzeichnissuche

Beitrag von nufan » So Aug 08, 2010 8:34 pm

Ich habe file.h und file.cpp mal überflogen und habe dazu ein paar Verbesserungsvorschläge:

Gleich mal die Dateinamen: Wenn sie die Methoden zum Durchsuchen von Verzeichnissen enthalten, wäre es doch sinnvoll sie filesearch.h und filesearch.cpp zu nennen.
Des weiteren finde ich das irgendwie widersprüchlich:

Code: Alles auswählen

    /**
      *This class represents the search-module.
      *It starts a thread for the search and
      *is searching recursivly all files below the
      *given path.
      */

    class File
Wenn ich (als nicht-Ersteller dieser Klasse) den Namen "File" lese, denke ich an eine einzelne Datei. Das dürfte bei dir wohl "FileInfo" sein.

Deine Schreibweise bei den Konstruktoren finde ich nicht sehr übersichtlich:

Code: Alles auswählen

FileSearch::File::File( std::string &start_path,
                        std::string &argv0 )
:
Path( start_path ),
ProgramPath( argv0 ),
SearchState( Dedupe::State::sleep ),
FileCounter( 0 ),
DirectoryCounter( 0 )
{
  Path = CreateAbsolutePath( Path );
  Directorys.push_back( Path );
  pthread_create( &SearchThread,NULL,Thread,this );
};
Wie wär's damit:

Code: Alles auswählen

FileSearch::File::File( std::string &start_path, std::string &argv0 ) :
                           Path( start_path ),
                           ProgramPath( argv0 ),
                           SearchState( Dedupe::State::sleep ),
                           FileCounter( 0 ),
                           DirectoryCounter( 0 )
{
  Path = CreateAbsolutePath( Path );
  Directorys.push_back( Path );
  pthread_create( &SearchThread,NULL,Thread,this );
};
Wo wir gerade bei der Formatierung sind... haben wir uns auf eine maximale Zeilenbreite geeinigt? 80 Zeichen wären auch für Konsolen-Editoren optimal, jedoch finde ich das etwas wenig.

Ein paar Methoden geben Vektoren zurück, z.B.:

Code: Alles auswählen

typedef std::vector<Dedupe::FileInfo> SearchResult;
SearchResult GetFiles();
Jetzt stell dir vor du hast ein paar tausend (millionen?) Suchergebnisse und gibst diese zurück. Der komplette Vektor (und damit jeder einzelne Wert im Vektor) wird kopiert... Wesentlich effizienter wäre es eine konstante Referenz zurückzugeben.

Irgendwo habe ich folgende Zeilen gesehen:

Code: Alles auswählen

  if( existing == true &&
      readable == true &&
      filetyp == FileSearch::TFile ||
      filetyp == FileSearch::TDirectory )
Ich kenne deinen Algorithmus nicht und weiß nicht was genau du hier überprüfst (naja die ersten beiden Zeilen kann ich mir schon denken ^^), aber das riecht geradezu nach Fehler ^^
Bist du dir bei dieser Formulierung sicher? Überdenke wie diese Bedingung ausgewertet wird und (egal ob es richtig ist oder nicht) setze entsprechende Klammern.

Weiters hat die Methode FileSearch::File::Thread kein return, obwohl void * als Rückgabetyp angegeben wurde, aber das hat dir dein Compiler hoffentlich auch schon gesagt :)

Kleiner Hinweis:

Code: Alles auswählen

  execpath.erase( ProgramPath.find_last_of( "/" ) + 1,
                  ProgramPath.length() );
Den zweiten Parameter kannst du dir sparen, es wird über ein Default-Parameter der komplette restliche String gelöscht, siehe:
http://www.cplusplus.com/reference/string/string/erase/

So... nun zur Sprache ;)
Für die Funktionalität des Programms unbedeutend, trotzdem finde ich es wichtig, dass man sich (sowohl in Kommentaren, als auch in Variablennamen etc.) zumindest grob an die Grammatik hält.
Bis auf den Satzanfang wird normalerweise alles klein geschrieben (Ausnahme: Eigennamen, in diesem Fall auch Variablennamen etc.).
Mehrzahl wird bis auf wenige Ausnahmen durch das simple Anhängen eines 's' erreicht ("path" wird zu "paths" und nicht zu "pathes"). Befindet sich ein 'y' am Ende des Wortes wird dieses nach "ie" aufgelöst ("directory" wird zu "directories" und nicht zu "directorys").
Mir fällt jetzt keine Regel dazu ein, es heißt aber "is_stopped" und nicht "is_stoped" ^^
Grammatik-Leerstunde-Ende :D

Wie bereits im ersten Satz gesagt sind das Verbesserungsvorschläge, es liegt also an dir die Vorschläge zu überdenken und Verbesserungen vorzunehmen - oder eben nicht. Den Code habe ich wie erwähnt nur überflogen, also korrigiere ich hier vielleicht auch Sachen ohne sie im notwendigen Kontext zu sehen ^^

Antworten