2013-07-14 7 views
9

Ich bin auf der Suche nach einer virtuellen Dateisystemebene in Perl. Etwas, das eine allgemeine Abstraktion für grundlegende Dateisystemroutinen wie ls, mkdir usw. bereitstellen würde, unabhängig davon, wie das eigentliche Dateisystem implementiert ist.Virtuelles Dateisystem in Perl

ich eine Schnittstelle wie diese möchten:

# create a directory "/some/path/tmp" in my current filesystem 
my $plainfs = Module::new->(type => 'local', root=>'/some/path); 
$plainfs->mdkir("/tmp"); 

# create "tmp" dir on a remote filesystem 
my $sshfs = Module::new->(type=>'ssh', root=>'user:[email protected]:~/pub') 
$sshfs->mdkir("/tmp"); 

I the VFS package auf MetaCPAN gefunden, leider gibt es nur leer, nicht implementierten Module.

Ist etwas bereits implementiert? Im Moment suche ich nur nach "lokalen" Dateisystemen und ftp oder ssh-Ich brauche kein Datenbank- "Dateisystem" oder irgendein anderes exotisches "Dateisystem" wie CVS oder so. Das Durchsuchen von 20k MetaCPAN-Modulen ist schmerzhaft, ohne ein Tagging-System oder ähnliches ...

+2

Datei :: System sieht gut aus: http://search.cpan.org/~hanenkamp/File-System-1.16/ – perreal

+0

@perreal Diese looks sind wirklich nett. Ich werde tiefer nachsehen. Wie findest Du es? Ich suche METACPAN nach "Dateisystem" und dieses Paket wird nicht auf den ersten 7 Seiten angezeigt. (Metacpan Suche ist wirklich schrecklich. Vielen Dank. – kobame

+1

@Kobame während es vorgeschlagen werden könnte Ich arbeitete rückwärts von der Antwort, wenn ich nach "Dateisystem" (keine Anführungszeichen) auf MetaCPAN suchen, ist dies das erste Ergebnis. Die Suche ist ausgezeichnet IME, aber es kann nur mit den Daten arbeiten, die es hat und die Eingabe geben Sie es –

Antwort

1

Vielleicht File::System ist was du suchst. Es bietet grundlegende Funktionen, die in gängigen Betriebssystemen zur Verwaltung eines virtuellen Dateisystems (nicht notwendigerweise nur aus Dateien und Verzeichnissen) enthalten sind. Die meisten Funktionen werden als Methode des File::System::Object-Pakets dargestellt.

1

Was ist mit einer FUSE-Implementierung? (Dateisystem im Benutzerbereich)? Ich würde vermuten, dass mindestens ein Pseudo-Dateisystem in Perl implementiert ist. Schließlich sollte es ziemlich einfach zu implementieren sein, im Grunde ist es nicht mehr als eine Reihe von Operationen wie mount, ls, df, stat und so weiter. Ich war mal durch autofs Quellen in C, sah ziemlich unkompliziert aus. Vielleicht möchten Sie auch http://code.google.com/p/mogilefs/ sehen.

+0

Ich will nicht "implementieren" Dateisystem, aber * benutze * bereits durchgeführte Implementierungen, also suche nach einem Modul was bereits die Abstraktion gemacht hat.Vielleicht ist es "machbar", aber hoffe in etwas was schon erledigt ist :) Geh mal nach mogilefs - danke für den Zeiger. – kobame

+0

nehmen Sie einfach alle Userspace-Dateisystem, und loszuwerden, was es unter jeder grundlegenden Operation Internals tun sollte, auf einer Top-Ebene, vielleicht durch die Eingabe von "return true" oder ähnlich. –

1

Seien Sie nicht zu sehr in den Modulansatz verfallen. Alles, was Sie brauchen, ist ein Dienstprogramm, das das SSH/FTP-Dateisystem als lokales Dateisystem einbindet, und dann werden Sie einfach Standardbefehle wie cd, mkdir und so weiter verwenden. Der Grund, warum Sie keine Module dafür sehen, ist, dass dieser Ansatz im Allgemeinen bevorzugt wird.

Blick auf http://sourceforge.net/apps/mediawiki/fuse/index.php?title=FileSystems

Sie werden einfach FUSE nutzen jede dieser Dateisysteme zu montieren und das ist es. Hier sind einige Links zu sehen, aber die meisten davon können auch in den meisten Distributionen als Pakete erhalten werden.

http://sourceforge.net/projects/lufs/ http://lftpfs.sourceforge.net

Hier Modul einfach FUSE-Dateisysteme in Perl montieren:

http://search.cpan.org/~dpavlin/Fuse/Fuse.pm

0

Es gibt eine Menge von File :: * Module, die verschiedene Teile des Cross-Plattform-Griff Dateisystem-Verwaltung.

Zum Beispiel:

use File::Spec::Functions qw(catfile); 

lassen Sie meine $ Dateiname erhalten = catfile $ root, $ path "$ Dateiname $ ext"; oder mein $ new_directory = catfile $ path, "new_sub_directory"; und stellen Sie sicher, dass Sie die richtigen Trennzeichen verwenden, z./oder \, und so weiter.

Eine andere Sache, die Sie scheinen zu wollen, kann gehabt werden:

use File::Path qw(make_path); 

was ziemlich praktisch ist, und kann wie make_path ($ NEW_DIRECTORY, {mode => 0755}) aufgerufen werden;

Ich bin mir nicht wirklich sicher, ob File :: System entfernte Systeme tatsächlich so behandelt, wie Sie es möchten.

Ein paar verschiedene Möglichkeiten, damit umzugehen, aber ich denke, Net :: SSH :: Expect ist, was ich in der Vergangenheit verwendet habe, und ist nicht so schlimm, obwohl Sie wahrscheinlich eine leichter haben Zeit, wenn Sie das Remote-Dateisystem irgendwie lokal mounten könnten, tun Sie, was Sie tun müssen, und dann unmounten Sie es.

Verwandte Themen