5

我正在尝试在 Python 中创建一个脚本来备份一些文件。但是,这些文件可以随时重命名或删除。我不希望我的脚本通过锁定文件来阻止这种情况;该文件应该能够在备份期间随时删除。

我怎样才能在 Python 中做到这一点?而且,会发生什么?如果无法读取流,我的对象会变为 null 吗?

谢谢!我对 Python 有点陌生。

4

2 回答 2

10

正如@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()

于 2013-08-11T07:51:28.153 回答
5

在包括 Linux 在内的类 UNIX 操作系统上,这不是问题。好吧,其他一些程序可能会在您读取文件的同时写入文件,这可能会导致问题(您正在复制的文件最终可能会损坏),但这可以通过验证通过来解决。

在 Windows 上,使用卷快照服务(又名卷影复制)。VSS 会在某一时刻创建卷的快照,您可以在快照上打开文件,而无需锁定原始卷上的文件。一个快速的谷歌在这里找到了一个使用 VSS 进行复制的 Python 模块:http: //sourceforge.net/projects/pyvss/

于 2013-01-17T22:04:04.533 回答