[英]Python: Opening a file without creating a lock
我正在尝试用 Python 创建一个脚本来备份一些文件。 但是,这些文件可以随时重命名或删除。 我不希望我的脚本通过锁定文件来防止这种情况发生; 在备份期间,该文件应该仍然可以随时被删除。
我怎样才能在 Python 中做到这一点? 而且,会发生什么? 如果无法读取流,我的对象是否会变为空?
谢谢! 我对 Python 有点陌生。
正如@kindall 所提到的,这是一个特定于 Windows 的问题。 Unix 操作系统允许删除。
要在 Windows 中执行此操作,我需要使用win32file.CreateFile()
来使用特定于 Windows 的dwSharingMode
标志(在 Python 的pywin32
,它只是称为shareMode
)。
粗略示例:
import msvcrt
import os
import win32file
file_handle = win32file.CreateFile(
'filename.txt', win32file.GENERIC_READ,
win32file.FILE_SHARE_DELETE | win32fileFILE_SHARE_READ | win32file.FILE_SHARE_WRITE,
None,
win32file.OPEN_EXISTING,
win32file.FILE_ATTRIBUTE_NORMAL,
None
)
with os.fdopen(msvcrt.open_osfhandle(file_handle, os.O_RDONLY)) as file_descriptor:
... # read from `file_descriptor`
注意:如果您需要在返回的文件句柄对象的生命周期之后保持win32 文件打开,您应该在该句柄上调用PyHandle.detach()
。
在类 UNIX 操作系统(包括 Linux)上,这不是问题。 好吧,其他一些程序可能会在您读取文件的同时写入文件,这可能会导致问题(您正在复制的文件最终可能会损坏),但这可以通过验证通过来解决。
在 Windows 上,使用卷快照服务(又名卷影复制)。 VSS 会在某个时刻创建卷的快照,您可以在不锁定原始卷上的文件的情况下打开快照上的文件。 一个快速的谷歌在这里找到了一个使用 VSS 进行复制的 Python 模块: http : //sourceforge.net/projects/pyvss/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.