实现文件系统

有一点小心,你可以为任何文件系统实现一个PyFilesystem接口,这将允许它与任何内置的FS类和工具互换工作。

要创建一个PyFilesystem接口,从 FS 派生一个类,并实现:ref:essential-methods。这应该给你一个工作的FS类。

注意复制方法签名,包括默认值。还必须遵循关于异常的相同逻辑,并且只在以下内容中引发异常 errors

构造函数

对于如何构造PyFilesystem类没有特别的要求,但是一定要调用没有参数的基类 __init__ 方法。

线程安全

所有文件系统应该是 线程安全 。实现它的最简单的方法是使用 _lock 属性,它由 FS 构造函数提供。这是一个来自标准库的 RLock 对象,可以用作上下文管理器,因此实现的方法将启动如下:

with self._lock:
    do_something()

你不是 必需 使用 _lock 。只要在多线程的FS对象上调用方法不会破坏任何东西。

Python版本

PyFilesystem支持Python2.7和Python3.X。 两个主要Python版本之间的差异主要由 six 库管理。

在编写新的FS类时,您没有义务支持PyFilesystem的相同版本的Python,但是如果您的项目是一般使用的,则建议使用。

测试文件系统

要测试您的实现,可以借用用于测试内置文件系统的测试套件。如果你的代码通过这些测试,那么你可以相信你的实现将无缝工作。

这里是测试一个名为 MyFS 的文件系统类的最简单的例子:

from fs.test import FSTestCases

class TestMyFS(FSTestCases):

    def make_fs(self):
        # Return an instance of your FS object here
        return MyFS()

您可能还想覆盖测试套件中的一些方法以进行更有针对性的测试:

基本方法

以下方法必须在PyFilesystem接口中实现。

  • getinfo() 获取有关文件或目录的信息。
  • listdir() 获取目录中的资源列表。
  • makedir() 创建一个目录。
  • openbin() 打开一个二进制文件。
  • remove() 删除文件。
  • removedir() 删除目录。
  • setinfo() 设置资源信息。

非基本方法

以下方法可以在PyFilesystem接口中实现。

这些方法在基类中具有默认实现,但是如果您可以提供更优化的版本,则可以覆盖这些方法。

应该实现哪些方法取决于数据的存储方式和位置。 对于网络文件系统,一个好的候选实现,是 scandir 方法,否则为每个文件调用 listdirgetinfo 的组合。

在一般情况下,最好看看这些方法是如何实现的 FS ,并且只写一个自定义版本,如果它比默认的更有效率。

  • appendbytes()
  • appendtext()
  • close()
  • copy()
  • copydir()
  • create()
  • desc()
  • exists()
  • filterdir()
  • getbytes()
  • gettext()
  • getmeta()
  • getsize()
  • getsyspath()
  • gettype()
  • geturl()
  • hassyspath()
  • hasurl()
  • isclosed()
  • isempty()
  • isfile()
  • lock()
  • movedir()
  • makedirs()
  • move()
  • open()
  • opendir()
  • removetree()
  • scandir()
  • setbytes()
  • setbin()
  • setfile()
  • settimes()
  • settext()
  • touch()
  • validatepath()

辅助方法

这些方法不应该实现。

实现这些可能不太值得的。

  • getbasic()
  • getdetails()
  • check()
  • match()
  • tree()