Wie in C Verzeichnis finden?

  • Hallo!
    Ich gehe mal davon aus, dass die Verzeichnisse in den Aufnahmen,
    z. B. 2013-06-03.21.05.141-0.rec eindeutig sind. Anhand dieser
    Verzeichnisse will ich Aufnahmen in einem bestimmten Pfad finden.
    Dabei soll die Pfadtiefe keine Rolle spielen.
    Ich suche deshalb nach diesem Verzeichnis, damit selbst nach einem
    Umbenennen der Aufnahme, diese immernoch eindeutig ist.
    Ich habe momentan diesen Codeblock. In der Variable const char *UniqueFolder
    ist der Name des zu suchenden Verzeichnisses. Dies funktioniert aber
    nur im Root des Pfades (hier /media/usb0).


    Geht das irgendwie einfacher?

  • Verzeichnisbäume durchsuchen, am Besten rekursiv!


    vdr-User-# 755 to_h264 chk_r vdr-transcode github

  • Und du musst noch auf Directory bzw. Link testen. Und dann rekursiv vorgehen.
    Dabei mußt du das Limit der offnen Files beachten. 1024 ist nicht allzuviel. Also erst die Directoryliste einlesen.
    Dann suchen, wenn nicht gefunden, rekursiv die Directories bearbeiten.


    P.S. mach aus dem != ein strcmp(a,b) sonst glaubt noch jemand man kann so Strings vergleichen.


    Edit: Eindeutig macht man normal über die INode, wenn du die vorher schon gemerkt hast.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Aber beim verfolgen der Links drauf achten nicht in ner Endlosschleife zu landen. Geht bei Rekursion ja so schön einfach endlos zu arbeiten ;)


    Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk 2

  • Ich hab jetzt mal ne Lösung gefunden, die zu funktionieren scheint:


    Wenn das UniqueFolder gefunden wird, wird die Membervariable
    ArchiveFound auf true gesetzt. So soll verhindert werden, dass
    weitergesucht wird, wenn wieder eine Ebene zurück gewechselt
    wird. Die Variable Path beinhaltet den gewünschten Pfad.
    Vielleicht nicht besonders elegant, aber es geht.

  • Die Formatierung des Quelltextes ist katastrophal. Wie wäre es mit etwas Einrückung?


    Also die globale Variable ist auch nicht so schick, würde ich mit einer Return-Value lösen.


    Gerald


    HP Proliant MicroServer Gen8, Xeon E3-1230, 12 GB RAM, 3xWD red 2TB im RAID 5, 2xSundtek MediaTV Home DVB-C/T, L4M TWIN-C/T, Ubuntu Server 14.04.1, Plex Media Server
    Samsung UE55H6470

  • chdir(".."); geht nicht umbedingt dorthin zurück wo du erwartest.
    Da du aber Links ignorierst, sollte es gehen.


    Dein Code ist nicht Threadsafe. Sollte als eigenständiges Programm laufen.
    Als Plugin von VDR funktioniert er nicht.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Links werden ignoriert, da eine Archive-HDD niemals Links
    beinhalten kann.
    Es handelt sich nicht um Code für ein Plugin, sondern es soll
    ein Patch für VDR werden. Das ganze wird vor der Wiedergabe
    ausgeführt. Der VDR darf also nicht weitermachen, bevor
    alles abgeschlossen ist.

  • Dann darfst du kein chdir ausführen. Weil dies unbekannte Auswirkungen auf andere Threads von VDR hat.
    Einen Puffer nehmen und darin den Pfad aufbauen.


    Ebensowenig darfst du readdir verwenden. Die Entsprechende Threadsafe Funktion ist readdir_r.


    Johns

    Sag mir, wo die Developer sind. Wo sind sie geblieben? . . . . . . . . . . . . . . . . . . . . SoftHdDevice - A software and GPU emulated HD output device plugin.
    Sag mir, wo die Developer sind. Was ist geschehn?


    Client0: Crown CW02 MSI_C847MS-E33 Zotac_GT640_passiv Cine-S2 iMon-MCE / streamdev softhddevice
    Client1: Lian_Li_PC-Q09FB ASRock_H67M-ITX/HT I3-2100 ASUS_ENGT520_passiv / streamdev softhddevice
    Test: Lian_Li_PC-Q09R Asus C60M1-I / streamdev
    Server0: Dockstar TT-S2-3600-USB / streamdev
    Server2: Lian_Li_PC-Q07R Intel_DH61DL G620 WD20EARX 90W PicoPSU Cine-S2+DuoFlex-S2+DuoFlex-CT / streamdev / 22 Watt Verbrauch

  • Dann darfst du kein chdir ausführen. Weil dies unbekannte Auswirkungen auf andere Threads von VDR hat.
    Einen Puffer nehmen und darin den Pfad aufbauen.


    Ebensowenig darfst du readdir verwenden. Die Entsprechende Threadsafe Funktion ist readdir_r.


    Johns


    Du meinst also, ein chdir bringt das ganze Programm aus seinem Arbeitsverzeichnis?

  • Natürlich. Ein Arbeitsverzeichnis gibt es immer nur einmal pro Prozess.


    Kannst du leicht selber ausprobieren.


    Einfach zwei Konsolenfenster aufmachen. Im folgenden bezeichnet als "Konsole 1" und "Konsole 2".


    Konsole 1:

    Code
    $ cd /usr
    $  echo $$
    727


    Also Arbeitsverzeichnis der Shell in Konsole 1 auf "/usr" und einmal PID ausgeben.


    Konsole 2:

    Code
    $ readlink /proc/727/cwd
    /usr


    Wenn du in der ersten Shell nun mit "cd" das Arbeitsverzeichnis änderst, dann wirst du in Konsole 2 auf dem gleichen Weg über /proc dieses wieder auslesen können. --> Ein Arbeitsverzeichnis pro PID --> Ein Arbeitsverzeichnis pro Prozess.

  • Durch folgenden Code bin ich chdir losgeworden:


    UniqueFolder und ArchivePath sind beides Membervariablen von cArchive.
    UniqueFolder beinhaltet das eindeutige Aufnahmeverzeichnis (z. B.
    2012-10-11.20.45.142-0.rec). ArchivePath ein char*, der den kompletten
    Pfad zum UniqueFolder halten soll. Die Funktion liefert true zurück, wenn
    der EIntrag gefunden wurde. So soll gleichzeitig auch verhindert werden,
    dass nach dem Auffinden von UniqueFolder, weitergesucht wird.
    Ich bin mir nur nicht sicher, ob ich durch das realloc von ArchivePath,
    den Speicher wieder mit free() freigeben muss. Und wenn ja, wo?
    Im Destructor von cArchive?
    Und ich weiss immernoch nicht, wie ich readdir durch readdir_r ersetzen muss.

  • Den Speicher musst du spätestens im Destruktor freigeben und ggf. auch im operator=. Übrigens ist sizeof(char)==1 per Definition. Das kannst du dir aber alles sparen, wenn du einfach eine String-Klasse verwendest, z.B. std::string aus der STL oder cString vom VDR. In der tools.h findest du auch einige andere nützliche Sachen. Beispiel (ungetestet):

    Give root password for maintenance (or type Control-D to continue): _

  • tag
    Danke! Das funktioniert ja bestens!
    An tools.h hab ich gar nicht gedacht. Warum werden im VDR dann überhaupt so
    viele char Pointer verwendet, wenn es cString in tools.h gibt?
    Gibt es irgendwo eine Beschreibung für tools.h? In der Headerdatei ist nicht
    alles selbsterklärend. Jedenfalls nicht für mich.

  • Mir ist keine Doku bekannt. Ich wühl mich auch immer durch die vdr sourcen wenn ich was suche. Mit der Zeit kommt aber ganz gut rein und findet schnell was man sucht, dazu mache ich auch gerne mal ein grep über die gesamten sourcen wenn man nicht weiß in welcher Header man jetzt Suchen muss. Die Lernkurve ist aber ziemlig steil das geb ich zu :)


    Grüße
    Martin

  • Moin,


    Die genauere Beschreibung von tools.h ist tools.c, SCNR. Einfach den Code lesen... :)


    Ich bin mir nicht sicher, ob der Teil des Verzeichnisses wirklich eindeutig ist, es wird jedenfalls nicht forciert. Er ist zwar mit hoher Wahrscheinlichkeit eindeutig, aber eben nicht zu 100%. Spätestens dann, wenn man die Archivplatte eines Kumpels anschließt.


    Leider konnten wir Klaus bisher nicht davon überzeugen, in der info-Datei eine global eindeutige ID, z.B. eine UUID zu hinterlegen. Es bleibt also beim raten.


    Lars.

  • Naja, wenn ich die Archivplatte eines anderen VDR verwenden will, brauch
    ich sowieo das zugehörige Verzeichnis in /video.
    Momentan scheint die Identifizierung durch dieses Verzeichnis die einfachste
    Lösung zu sein.
    Eine erste Version des Archivpatch ist übrigens fertig.

  • Zitat

    Ich bin mir nicht sicher, ob der Teil des Verzeichnisses wirklich eindeutig ist, es wird jedenfalls nicht forciert. Er ist zwar mit hoher Wahrscheinlichkeit eindeutig, aber eben nicht zu 100%. Spätestens dann, wenn man die Archivplatte eines Kumpels anschließt.


    So wie extrecmenu es eingeführt hat ist es auch nur als Archiv zum Stamm-VDR gedacht. Wenn die index nicht mit auf der Archiv HDD ist wird es auch fehlschlagen wenn die Archiv HDD nicht genau zum Videodir passt.


    Ich habe bei mir im Stammverzeichnis der Archiv HDD eine hdd.vdr um aus allen autogemounteten HDDs die richtige Archiv HDD zu finden. Ferner steht dort drin der relative Verzeichnispfad zum VDR Archiv.


    Man könnte es ja so machen das man dort auch noch die GUID des VDR (könte man bei der Installation erzeugen lassen und ins Videoverzeichnis schreiben) reinschreibt. Eine Archiv HDD des eigenen VDR wird als Archiv HDD benutzt. Eine Archiv HDD eines fremden VDR wird ins Videoverzeichnis reingehängt (mount bind und .update).



    Wobei ich deinen ( mase) Ansatz mit dem manuellen mounten heutzutage sehr unpraktisch finde (Kein Meckern sondern als Feedback gedacht).
    Normalerweise übernimmt heutzutage irgendein System das automatische mounten von Medien nach "/media" (sobald man sie ansteckt). Und hier könnte man das reinhängen für VDR fremde Archiv HDDs auch unterbringen.
    IMHO wäre es praktischer wenn der Patch unter einem konfigurierten Verzeichnis (Default "/media") nach dem richtigen Unterverzeichnis (daher auch meine Idee mit der Informativen Datei im root der Archiv HDD) suchen würde um sie dann per Softlinks einzuhängen.


    Gesendet von meinem ALCATEL ONE TOUCH 997D mit Tapatalk 2

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!