实现文件系统¶
有一点小心,你可以为任何文件系统实现一个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
方法,否则为每个文件调用 listdir
和 getinfo
的组合。
在一般情况下,最好看看这些方法是如何实现的 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()