实现文件系统

有一点小心,你可以为任何文件系统实现一个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()

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

class fs.test.FSTestCases

Basic FS tests.

assert_bytes(path, contents)

Assert a file contains the given bytes.

参数:
  • path (str) – A path on the filesystem.
  • contents (bytes) – Bytes to compare.
assert_exists(path)

Assert a path exists.

参数:path (str) – A path on the filesystem.
assert_isdir(path)

Assert a path is a directory.

参数:path (str) – A path on the filesystem.
assert_isfile(path)

Assert a path is a file.

参数:path (str) – A path on the filesystem.
assert_not_exists(path)

Assert a path does not exist.

参数:path (str) – A path on the filesystem.
assert_text(path, contents)

Assert a file contains the given text.

参数:
  • path (str) – A path on the filesystem.
  • contents (str) – Text to compare.
destroy_fs(fs)

Destroy a FS object.

参数:fs – A FS instance previously opened by ~fs.test.FSTestCases.make_fs.
make_fs()

Return an FS instance.

基本方法

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

非基本方法

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

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

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

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

辅助方法

这些方法不应该实现。

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