3

我想读/写一个文件,但允许它被其他进程删除/重命名。在C#你可以用 a 打开文件时FileShare.Delete,Python 是否有等价物?

4

1 回答 1

6

如果你想要一个跨平台的等价物……真的没有。在 POSIX 系统上,其他进程始终可以删除/重命名您打开的文件*,除非您竭尽全力阻止它。因此,您只需要为 Windows 执行此操作,并且几乎无处不在

Python 的标准文件对象不允许您直接控制 Windows 共享标志。(这是因为它们使用跨平台 API,例如 stdio,fopen而不是特定于 Windows 的 API。)

如果你想这样做,你必须调用不同的文件函数。

在 IronPython 中,您当然可以调用在 C# 中调用的完全相同的 .NET 函数。

在 CPython 中,您不能使用 .NET,因为 CPython 是本机 Win32 应用程序。这意味着您必须调用CreateFile. 您可以使用pywin32包使这更容易,但这仍然有点痛苦。

而不仅仅是f = open(path, 'r+'),你需要这样的东西(未经测试):

f = win32file.CreateFile(path, 
                         win32con.GENERIC_READ | win32con.GENERIC_WRITE,
                         win32con.FILE_SHARE_DELETE,
                         None, 
                         0, 
                         win32con.OPEN_ALWAYS,
                         None)

然后,而不是buf = f.read(4096),你做:

buflen, buf = win32file.ReadFile(f, 4096, None)

with而且,您必须明确地关闭它,而不是仅仅将它粘贴在一个语句中:

win32file.CloseFile(f)

如果您打算做很多这样的事情,将win32file句柄包装在类似文件的对象中并不难,而且可能值得这样做。

最棘手的一点是决定您希望与 的参数保持多近open,并编写代码将您获得的值转换为CreateFile想要的值。(还有一些边缘情况,Win32 本机文件处理方式与 Win32 stdio 文件不同,但通常这些不会让您感到厌烦。)

您可能还想查看帮助程序的io模块,这些帮助程序让您只需实现少数原始打开/读取/写入/关闭函数并将其自动包装在一个完整的类似文件的对象中。


* 实际上,他们所能做的就是取消链接您打开的目录条目。即使这是链接到该文件的唯一目录条目,该文件本身仍然存在,直到它的最后一个打开句柄被关闭。

于 2013-10-09T19:37:10.740 回答