繁体   English   中英

Python:打开文件而不创建锁

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM