2013-07-14 5 views
9

Я ищу слой виртуальной файловой системы в Perl. Что-то, что обеспечило бы общую абстракцию для основных подпрограмм файловой системы, таких как ls, mkdir и т. Д., Независимо от того, как реализована фактическая файловая система.Виртуальная файловая система в Perl

Я хотел бы интерфейс, как это:

# 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"); 

я нашел the VFS package на MetaCPAN, к сожалению, есть только пустые, нереализованные модули.

Что-то уже реализовано? Прямо сейчас, я ищу только «локальные» файловые системы и ftp или ssh-мне не нужна база данных «файловая система» или любая другая экзотическая «файловая система», например, CVS. Поиск 20k модулей MetaCPAN является болезненным без какой-либо системы мечения или аналогично ...

+2

Файл :: Система выглядит хорошо: http://search.cpan.org/~hanenkamp/File-System-1.16/ – perreal

+0

@perreal Это хорошо выглядит. Продолжайте проверять глубже. Как вы его нашли? Я ищу METACPAN для «файловой системы», этот пакет не отображается на первых 7 страницах. (Metacpan search REALLY TERRIBLE. Большое спасибо – kobame

+1

@kobame, хотя можно было бы предложить, что я работал в обратном направлении от ответа, если я ищу «файловую систему» ​​(без кавычек) на MetaCPAN, это первый результат. является отличным IME, но он может работать только с данными, которые он имеет, и вводимыми вами данными. –

ответ

1

Возможно, File::System - это то, что вы ищете. Он обеспечивает базовые функции, которые можно найти в обычных операционных системах для управления виртуальной файловой системой (не обязательно состоящей только из файлов и каталогов).

Большинство функциональных возможностей представлено как метод пакета File::System::Object.

1

Что относительно реализации FUSE? (файловая система в пользовательском пространстве)? Я бы предположил, что на нем есть, по крайней мере, одна псевдо-файловая система, реализованная в perl. В конце концов, это должно быть довольно легко реализовать, в основном это не более чем некоторый набор операций, таких как mount, ls, df, stat и т. Д. Я был когда-то через autofs источников в C, выглядел довольно просто. Возможно, вы захотите также посмотреть http://code.google.com/p/mogilefs/.

+0

Я не хочу «реализовывать», файловую систему, но * используйте * уже реализованные реализации, поэтому ищем модуль, который уже сделал абстракцию. Вероятно, это «выполнимо», но надеется на что-то, что уже сделано :) Going to check mogilefs - thanx для указателя. – kobame

+0

просто возьмите любую файловую систему пользовательского пространства и избавитесь от того, что она должна делать при каждой базовой операции, на каком-то верхнем уровне, возможно, поместив «return true» или подобное. –

1

Не зацикливайтесь на модульном подходе. Все, что вам нужно, это некоторая утилита, которая монтирует файловую систему SSH/FTP в качестве локальной файловой системы, а затем вы просто будете использовать стандартные команды, такие как cd, mkdir и т. Д. Причина, по которой вы не видите никаких модулей для этого, заключается в том, что этот подход в целом предпочтителен.

Посмотрите на http://sourceforge.net/apps/mediawiki/fuse/index.php?title=FileSystems

Вы просто использовать FUSE для монтирования любой из этих файловых систем и что это. Вот некоторые ссылки, на которые можно посмотреть, но большинство из них можно получить как пакеты в большинстве дистрибутивов.

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

Здесь модуль просто смонтировать файловые системы FUSE в Perl:

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

0

Есть много из файла :: * модули, обрабатывать различные части кросс-платформенной управление файловой системой.

Например:

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

позволит вам получить мой $ имя_файла = catfile $ корень, $ путь "$ имя_файла $ внутр"; или my $ new_directory = catfile $ path, "new_sub_directory"; и обязательно используйте правильные разделители, например./или \, и так далее.

Еще одна вещь, вы, кажется, хотите можно было с:

use File::Path qw(make_path); 

который довольно удобно, и можно назвать как make_path ($ new_directory, {режим => 0755});

Я не уверен, что File :: System фактически обрабатывает удаленные системы так, как вы хотите.

Для меня это несколько разных способов, но я думаю, что Net :: SSH :: Expect - это то, что я использовал в прошлом, и не так уж плохо, хотя, возможно, вам будет легче если вы каким-то образом смонтируете удаленную файловую систему локально, сделайте то, что вам нужно сделать, затем отключите ее.

Смежные вопросы