我正在尝试在 Python 中创建一个脚本来备份一些文件。但是,这些文件可以随时重命名或删除。我不希望我的脚本通过锁定文件来阻止这种情况;该文件应该能够在备份期间随时删除。
我怎样才能在 Python 中做到这一点?而且,会发生什么?如果无法读取流,我的对象会变为 null 吗?
谢谢!我对 Python 有点陌生。
我正在尝试在 Python 中创建一个脚本来备份一些文件。但是,这些文件可以随时重命名或删除。我不希望我的脚本通过锁定文件来阻止这种情况;该文件应该能够在备份期间随时删除。
我怎样才能在 Python 中做到这一点?而且,会发生什么?如果无法读取流,我的对象会变为 null 吗?
谢谢!我对 Python 有点陌生。
正如@kindall 所提到的,这是一个特定于 Windows 的问题。Unix 操作系统允许删除。
要在 Windows 中执行此操作,我需要使用win32file.CreateFile()
特定于 Windows 的dwSharingMode
标志(在 Python 中pywin32
,它只是称为shareMode
)。
粗略的例子:
import msvcrt
import os
import win32file
py_handle = win32file.CreateFile(
'filename.txt',
win32file.GENERIC_READ,
win32file.FILE_SHARE_DELETE
| win32file.FILE_SHARE_READ
| win32file.FILE_SHARE_WRITE,
None,
win32file.OPEN_EXISTING,
win32file.FILE_ATTRIBUTE_NORMAL,
None
)
try:
with os.fdopen(
msvcrt.open_osfhandle(py_handle.handle, os.O_RDONLY)
) as file_descriptor:
... # read from `file_descriptor`
finally:
py_handle.Close()
注意:如果您需要在返回的文件句柄对象的生命周期之后保持win32 文件打开,您应该在该句柄上调用。PyHandle.detach()
在包括 Linux 在内的类 UNIX 操作系统上,这不是问题。好吧,其他一些程序可能会在您读取文件的同时写入文件,这可能会导致问题(您正在复制的文件最终可能会损坏),但这可以通过验证通过来解决。
在 Windows 上,使用卷快照服务(又名卷影复制)。VSS 会在某一时刻创建卷的快照,您可以在快照上打开文件,而无需锁定原始卷上的文件。一个快速的谷歌在这里找到了一个使用 VSS 进行复制的 Python 模块:http: //sourceforge.net/projects/pyvss/