2016-05-28 10 views
0

Ich bin gerade dabei, ein Programm zu schreiben und brauche eine Anleitung. Im Wesentlichen versuche ich festzustellen, ob eine Datei mit einem Marker oder einer Markierung versehen ist. So ähnlich wie die Attribute für einen HTTP-Header.Attributsystem ähnlich wie HTTP-Header für lokale Dateien

Wenn ein solcher Marker existiert, wird diese Datei manipuliert (in ein anderes Verzeichnis verschoben).

Meine Frage ist: Wo genau sollte ich diese Flagge/Marker speichern? Haben Dateien ein ähnliches System wie HTTP Header? Ich möchte nicht auf den Inhalt der Datei zugreifen oder ihn manipulieren, sondern nur eine Eigenschaft der Datei, die bearbeitet werden kann, ohne die eigentliche Datei zu beschädigen - und sie muss unter Dateitypen als meine potentielle Domäne von Dateitypen ziemlich universell sein ist nicht gebunden. Ich habe etwas Erfahrung mit Web-APIs, also bin ich mit HTTP-Überschriften und json vertraut. Gibt es ein ähnliches System für lokale Dateien in Windows? Ich interessiere mich besonders für jeden, der professionelle/branchenspezifische Kenntnisse über gängige Techniken besitzt, die Programmierer verwenden, wenn sie versuchen, Metadaten in Dateien zu speichern, um später darauf zuzugreifen. Oder wenn jemand weiß, wo er mich hinweist, da ich nicht sicher bin, was ich recherchieren soll.

Für den Eintrag werde ich ein Programm für Windows schreiben, wahrscheinlich mit Golang oder Python. Und die Dateien, die ich manipuliere, sind potentiell alle gängigen (.docx, .txt, .pdf, etc.)

Vielen Dank im Voraus!

+0

Wenn Sie nach einer breiten Palette von Inhaltstypen suchen, benötigen Sie beispielsweise: https://tika.apache.org/. Andernfalls hat Go HTTP pkg einen grundlegenden 'DetectContentType', der bei einigen MIME-Typen auftreten kann. In den meisten Fällen müssen Sie sich auf die Dateiköpfe oder die Erweiterung für die Typerkennung verlassen (es gibt Pakete dafür). – MrSaints

+0

@MrSaints Ich suche eine nicht webbasierte Lösung. Es ist ein Programm zum Verschieben von Dateien auf Windows basierend darauf, ob sie ein 'Dateiattribut' haben oder nicht. Ich habe nur das, was ich brauche, mit HTTP-Headern verglichen. Außerdem musste ich den Inhaltstyp nicht bestimmen, ich hoffte auf eine Methode, mit der ich die "Header" aller Dateien unabhängig von ihrem Inhaltstyp bearbeiten konnte. Vielen Dank. –

+0

Dateimetadaten, z. B. der Titel einer PDF, die Anzahl der Zeilen in einem Office-XML-Dokument (.docx), der Künstler in einer MP3-Datei usw. sind alle dateispezifisch. NTFS bietet eine API für diese Art von Informationen unter Verwendung seiner ["Alternate Data Streams"] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/416cf926-a091-4028-8d09-f9d93c3b1ba7/read -any-Datei-Details-und-Metadaten-using-c? Forum = vclanguage # bf763052-f2c4-4578-ba33-2a2105ac5447), vorausgesetzt, Windows hat die ADS für die Datei an erster Stelle erstellt. Ich kenne keine Go-Pakete, um diese Informationen zu erhalten. –

Antwort

2

Metadaten, die Sie hinzufügen möchten, werden am besten in einer separaten Datei oder Datenbank für alle Dateien aufbewahrt.

Oder in einer anderen Datei mit dem gleichen Namen und andere Erweiterung oder Präfix, die Sie ausblenden können.

Sich auf ein Dateisystem zu verlassen, ist sehr schwierig und Ihre Daten sind an die Beschränkungen und Fähigkeiten des Dateisystems gebunden, auf dem Ihre Datei gespeichert ist. Und Sie können nicht darauf zählen, dass Ihre Daten intakt bleiben, da jede Anwendung diese Flags ändern möchte.

Und einige von denen haben sehr spezifische, klar Verwendung definiert, wie die Erstellungszeit, Änderungszeit, Zugriffszeit ...

See, wenn Sie das Dokument müssen nur das Markieren, können Sie möchten die Erstellungszeit verwenden, , die während der Laufzeit dieses Dokuments unverändert bleiben (bis es kopiert wird), um Ihre Flaggen zu speichern. : D

Sehr schmutziges Geschäft, unprofessionell, unzuverlässig und all das.

Aber es ist eine Lösung. Schlechter, aber existiert.

Ich weiß nicht, dass FAT32 oder NTFS-Dateisysteme irgendwelche zusätzlichen Bits für das Markieren unterstützen, außer denen, die bereits vom Betriebssystem verwendet werden. Unixes EXT-Familie FS unterstützen einige zusätzliche Bits. Und selbst dann sollten Sie vorsichtig sein, falls eine andere wichtige Anwendung sie für etwas verwendet.

Mac OS unterstützt möglicherweise einige Metadaten selbst, aber ich bin nicht 100% sicher.

Unter Windows haben Sie eine weitere Option, um mehr Daten mit einer Datei zu verknüpfen, aber das würde ich auch nicht verwenden.

Nun, NTFS-Dateisystem (FAT unterstützt das nicht) hat eine Funktion namens Streams.

In essential, same file can have multiple data streams under itself. I.e. You have more than one file contents under same file node. 

Um klarer zu sein. Die gleiche Datei enthält zwei verschiedene Dateien.

Wenn Sie die Datei öffnen, ist normalerweise nur der Hauptstream für die Anwendung sichtbar. Anwendungen müssen überprüfen, ob die anderen Streams vorhanden sind, und die gewünschte Streams auswählen.

Sie können also Metadaten im zweiten Stream der Datei speichern.

Aber was ist, wenn alle Ströme genommen werden?

Noch mehr, Anti-Viren-Programme können Sie den Zugriff auf die Metadaten aus Paranoya verhindern, oder zumindest um eine Erlaubnis bitten. Ich weiß nicht, warum MS diese Option enthielt, wahrscheinlich für Datenduplizierung oder so, aber schlechte Hacker nutzten die Tatsache, dass Sie einige Daten unter vorhandenen regulären Dateien speichern können, die niemandem bekannt ist.

Stellen Sie sich einen Virus vor, der seine Kopie in einen anderen Stream eines der bereits vorhandenen Programme schreibt.

Alles, was zum Starten benötigt wird, anstelle des alten Programms, wenn Sie es das nächste Mal ausführen, ist ein Batch-Skript, das dem Taskplaner hinzugefügt wurde und zwei Datenströme umwandelt.

Nasty Trick! Als diese Funktion missbraucht wurde, begann die Antivirus-Software damit, Dateien mit mehreren Streams einzuschränken. Es ist also so, dass diese Funktion nicht existiert.

Wenn Sie einige Metadaten mithilfe der Technologie von OS hinzufügen möchten, verwenden Sie die Windows-Registrierung , aber auch das ist unklug.

Was soll ich Ihnen sagen? Fügen Sie keine Metadaten zu Dateien hinzu, organisieren Sie keine separate Datei oder indizieren Sie Ihre Daten in speziellen Dateien mit demselben Namen wie die Datei, auf die Sie verweisen, und in demselben Ordner.

+0

Ich schätze Ihre volle Auswahl an Möglichkeiten! Dadurch: antworte. Obwohl danke auch @ saq7. Es sieht so aus, als ob Sie und Dalen zu dem gleichen Schluss kamen, eine Datenbank zu verwenden. Ich denke, ich werde mich darum kümmern. Danke allen! –

+0

Ich würde hinzufügen, dass 'extN'-Dateisysteme (und auch' XFS', 'ZFS',' JFS' usw.) die sogenannten "erweiterten POSIX-Attribute" und "erweiterte Attribute des Benutzers" unterstützen. Einige Dateisysteme benötigen bestimmte Einblendungs-Flags, damit andere sie standardmäßig aktivieren können. Die Schlüsselwörter zu googlen: 'xattr',' setxattr', 'getxattr'. – kostix

1

Wenn Sie mit Binärdateien wie docx und pdf arbeiten, speichern Sie die Metadaten am besten in separaten Dateien oder in einer SQLite-Datei.

Metadaten werden normalerweise getrennt von Dateien gespeichert, in Datenstrukturen, die Inodes genannt werden (zumindest in Unix-Systemen hat Windows wahrscheinlich etwas Ähnliches). Aber Sie wollen wahrscheinlich nicht so tief in das Kaninchenloch eindringen.

Wenn es Ihr Ziel ist, das System basierend auf Metadaten abzufragen, dann wäre es einfacher und effizienter, etwas SQLite zu verwenden. Wenn die Metadaten in der Datei enthalten sind, würde dies bedeuten, dass Sie die Datei öffnen, sie von der Festplatte in den Speicher einlesen und dann die Metadaten überprüfen müssten - d. H. Langsamere Abfragen.

Wenn Sie keine Abfrage basierend auf Metadaten durchführen müssen, kann das Speichern von Metadaten in der Datei sinnvoll sein. Es würde die Abhängigkeiten in Ihrer Anwendung reduzieren. Um jedoch über Word oder Adobe Reader auf den Inhalt der Datei zuzugreifen, müssen Sie die Metadaten entfernen, bevor Sie sie an die Anwendung übergeben. Die Mühe lohnt sich nicht, normalerweise

+0

Vielleicht haben Sie Glück mit einigen Formaten - docx ist eine Zip-Datei, vielleicht würde das Hinzufügen von Daten innerhalb des Archivs MS Word nicht verwirren. Zumindest sollte es nicht. Aber wie für andere Formate, gut, +1 für die Erwähnung von SQLite – Dalen