【问题标题】:Virtual filesystem in PerlPerl 中的虚拟文件系统
【发布时间】:2015-09-14 20:59:34
【问题描述】:

我正在寻找 Perl 中的虚拟文件系统层。无论实际文件系统是如何实现的,都可以为 lsmkdir 等基本文件系统例程提供一般抽象。

我想要这样的界面:

# 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:password@example.com:~/pub')
$sshfs->mdkir("/tmp"); 

我在 MetaCPAN 上找到了the VFS package,不幸的是只有空的、未实现的模块。

已经实施了吗?现在,我只寻找“本地”文件系统和 ftp 或 ssh——我不需要数据库“文件系统”或任何其他奇特的“文件系统”,如 CVS 左右。如果没有任何标记系统或类似系统,搜索 20k MetaCPAN 模块会很痛苦……

【问题讨论】:

  • 文件::系统看起来不错:search.cpan.org/~hanenkamp/File-System-1.16
  • @perreal 这看起来真不错。打算更深入地检查。你是怎么找到它的?我正在 METACPAN 中搜索“文件系统”,但该软件包未在前 7 页中显示。 ;( Metacpan 搜索真的很糟糕。非常感谢。
  • @kobame 虽然可以建议我从答案向后工作,但如果我在 MetaCPAN 上搜索“文件系统”(无引号),这是第一个结果。搜索是出色的 IME,但它只能使用它拥有的数据和您提供的输入
  • 用于处理远程服务器 Rex 看起来不错:rexify.org

标签: perl


【解决方案1】:

也许File::System 就是您要找的。它提供了常见操作系统中用于管理虚拟文件系统(不一定只包含文件和目录)的基本功能。

大部分功能都以File::System::Object 包的方法呈现。

【讨论】:

    【解决方案2】:

    一些 FUSE 实现呢? (用户空间中的文件系统)?我猜想至少有一个基于此的 perl 中实现的伪文件系统。毕竟应该很容易实现,基本上就是mount、ls、df、stat等一些操作。我曾经浏览过 C 中的 autofs 源代码,看起来很简单。您可能还想查看http://code.google.com/p/mogilefs/

    【讨论】:

    • 我不想要'实现'文件系统,但是use已经完成了实现,所以寻找一个已经完成抽象的模块。可能它是“可行的”,但希望已经完成的事情:) 去检查 mogilefs -thanx 的指针。
    • 只需使用任何用户空间文件系统,并摆脱它在每个基本操作内部应该做的事情,在某个顶层,可能通过输入“return true”或类似的方式。
    【解决方案3】:

    不要太拘泥于模块方法。您所需要的只是一些将 SSH/FTP 文件系统挂载为本地文件系统的实用程序,然后您只需使用标准命令,如 cd、mkdir 等。您看不到任何模块的原因是这种方法通常是首选。

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

    您将简单地使用 FUSE 挂载任何这些文件系统,仅此而已。这里有一些链接可供查看,但其中大部分也可以作为包在大多数发行版中获得。

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

    这是在 perl 中简单地挂载 FUSE 文件系统的模块:

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

    【讨论】:

      【解决方案4】:

      有很多 File::* 模块可以处理跨平台文件系统管理的不同部分。

      例如:

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

      会让你得到我的 $filename = catfile $root, $path, "$filename.$ext";或者我的 $new_directory = catfile $path, "new_sub_directory";并确保使用正确的分隔符,例如/ 或 \,等等。

      您似乎想要的另一件事可以通过:

      use File::Path qw(make_path);
      

      非常方便,可以像 make_path($new_directory, { mode => 0755 }); 一样调用

      我不确定 File::System 是否真的按照你想要的方式处理远程系统。

      我想到了几种不同的方法来处理这个问题,但我认为 Net::SSH::Expect 是我过去使用过的,而且还不错,尽管您可能会更轻松一些如果你能以某种方式在本地挂载远程文件系统,做你必须做的,然后卸载它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 2010-11-04
        • 2010-11-24
        • 2013-04-28
        • 1970-01-01
        • 2015-11-29
        相关资源
        最近更新 更多