Jörg Peschke: Linux I-Nodes

Hallo,
Existiert unter Java eine Klasse, mit der man die Linux-Inode-Nummer einer Datei ermitteln kann?
Der übliche Verdächtige File führt leider nicht zum Ziel, ähm, zum Node :) .

Wenn sowas unter Java gar nicht geht: Welche Möglichkeiten habe ich sonst noch, eine Datei eindeutig zu identifizieren?

(Hintergrund: Die Datei soll auch noch auffindbar sein, wenn sie unter Linux mit "mv" wegverschoben wurde. Deswegen kommen Pfad-Angaben zur Identifikation eigentlich nicht in Frage...Inodes hingegen wären perfekt)

  1. Hallo Jörg,

    Existiert unter Java eine Klasse, mit der man die Linux-Inode-Nummer einer Datei ermitteln kann?

    Naja, ne kurze Suche im Internet hat mich zu folgendem geführt: http://www.bmsi.com/java/posix/package.html - dort gibt's ne Klasse, die java.io.File erweitert und eine Methode getStat() bietet, die Dir ein Objekt zurückgibt, das als Attribut die Inode-Nummer enthält. Ich habe allerdings keine Ahnung, wie empfehlenswert das Paket da ist.

    (Hintergrund: Die Datei soll auch noch auffindbar sein, wenn sie unter Linux mit "mv" wegverschoben wurde. Deswegen kommen Pfad-Angaben zur Identifikation eigentlich nicht in Frage...Inodes hingegen wären perfekt)

    Nein, wären sie nicht. Folgende Situation: Du hast eine Datei »hallo«. Du gibst jetzt auf der Kommandozeile »ln hallo bonjour« ein. Damit erzeugst Du einen Hard-Link von »hallo« auf »bonjour«. Nach dieser Operation kannst Du jedoch nicht mehr feststellen, ob »bonjour« jetzt ein Hardlink auf »hallo« ist oder »hallo« ein Hardlink auf »bonjour« - Du siehst *danach* nur zwei Verzeichniseinträge mit dem Namen »hallo« und »bonjour«, die beide auf die gleiche (!) INode zeigen.

    Und noch etwas anderes: Was passiert, wenn Du die Datei zuerst kopierst und dann löschst? Dann ändert sich die INode-Nummer der Datei, die aber vom Inhalt her noch die gleiche ist.

    Ich halte deswegen Deinen Wunsch, eine Datei unabhängig ihres Dateinamens zu identifizieren, für nicht machbar.

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. Moin!

      Und noch etwas anderes: Was passiert, wenn Du die Datei zuerst kopierst und dann löschst? Dann ändert sich die INode-Nummer der Datei, die aber vom Inhalt her noch die gleiche ist.

      Richtig. Es ist ein Sonderfeature gewisser Editoren wie vim, dass sie i-node-echt arbeiten. Andere Editoren wie z.B. joe benennen die alte Datei beim Speichern um und schreiben den Text in eine neue Datei.

      Ich halte deswegen Deinen Wunsch, eine Datei unabhängig ihres Dateinamens zu identifizieren, für nicht machbar.

      Abgesehen davon, dass es schwierig wäre, die Datei nur anhand ihrer Nodenummer wiederzufinden. Alle Verzeichnisse rekursiv durchgucken und nachsehen, mit welchem inode die Einträge verbunden sind, ist jedenfalls nicht sehr effizient, würde ich meinen.

      Abgesehen davon sind inodes eine sehr dateisystemnahe Eigenschaft, deren Vorhandensein nicht garantiert werden kann - gerade bei Java.

      - Sven Rautenberg

      --
      "Love your nation - respect the others."
      1. Hallo,
        Danke für deine Hinweise.

        Richtig. Es ist ein Sonderfeature gewisser Editoren wie vim, dass sie i-node-echt arbeiten. Andere Editoren wie z.B. joe benennen die alte Datei beim Speichern um und schreiben den Text in eine neue Datei.

        Das ganze handelt sich um eine Art "Datiarchiv" welches wir intern einsetzen. Deswegen können sich Dateien eigentlich nicht ändern, bzw. wenn sie es tun, sind das neue Dateiversionen, die auch als "neue Objekte" behandelt werden müssen.
        Das System haben wir bereits in PHP ebenso (mit Inodes) realisiert, da klappt das wunderbar. Ich will eben nur mal probieren, das auf Java zu portieren.

        Abgesehen davon, dass es schwierig wäre, die Datei nur anhand ihrer Nodenummer wiederzufinden. Alle Verzeichnisse rekursiv durchgucken und nachsehen, mit welchem inode die Einträge verbunden sind, ist jedenfalls nicht sehr effizient, würde ich meinen.

        Nope, ich werde das ganze auch über Pfadnamen zugreifbar machen (hier gibts ja in Java bereits sehr viel praktische Methoden, wäre ja doof, wenn ich die nicht nutzen würde).
        Es geht um das Umgekehrte, wie finde ich zu einer Datei Informationen, die dieser Datei zugeordnet sind, die sich auch dann der datei zuordnen lassen, wenn ich die Datei umbennene oder verschiebe.

        Abgesehen davon sind inodes eine sehr dateisystemnahe Eigenschaft, deren Vorhandensein nicht garantiert werden kann - gerade bei Java.

        Das ist richtig. Das Ding wird aber nur auf unserem eigenen Server eingesetzt, auf dem ich von Inodes ausgehen kann.

        Grüße,
        Jörg

    2. Hallo,

      Naja, ne kurze Suche im Internet hat mich zu folgendem geführt: http://www.bmsi.com/java/posix/package.html - dort gibt's ne Klasse, die java.io.File erweitert und eine Methode getStat() bietet, die Dir ein Objekt zurückgibt, das als Attribut die Inode-Nummer enthält.

      Danke für den Link! Ist mir bei meiner Google-Suche irgendwie entgangen. Probiere ich mal aus.

      Ich halte deswegen Deinen Wunsch, eine Datei unabhängig ihres Dateinamens zu identifizieren, für nicht machbar.

      Für Fälle wie Hard-Links und das von dir beschriebene Kopieren und dann Löschen hast Du natürlich recht, da funktioniert das nicht.
      Ich werde evtl. auch Pfadnamen mitspeichern, um das ganze "doppelt" abzusichern.

      Es ist aber nicht nötig, dass das System mit allen Feinheiten, die ext2 oder ext3 so zu bieten hat umgehen kann.
      Die Identifikation der Dateien brauche ich, um Dateien mit Meta-Informationen versehen zu können (z.b. Kommentaren o.ä.).
      Deswegen sollen die Dateien sicher gegen "Standard-Operationen" sein (eben z.b. umbenennen oder Verschieben).

      Viele Grüße,
      Jörg