我想读/写一个文件,但允许它被其他进程删除/重命名。在 C#
中,您可以使用 FileShare.Delete
打开文件,Python 是否具有等效项?
最佳答案
如果你想要一个跨平台的等价物……真的没有。在 POSIX 系统上,其他进程始终可以删除/重命名您打开的文件*,除非您不遗余力地阻止它。因此,您只需要为 Windows 执行此操作,并且几乎无处不在
Python 的标准文件对象不允许您直接控制 Windows 共享标志。 (这是因为他们使用跨平台 API,例如 stdio 的 fopen
而不是 Windows 特定的 API。)
如果你想这样做,你必须调用不同的文件函数。
在 IronPython 中,您当然可以调用与在 C# 中调用的完全相同的 .NET 函数。
在 CPython 中,您不能使用 .NET,因为 CPython 是 native 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 native 文件与 Win32 stdio 文件的处理方式不同,但通常这些不会咬你。)您可能还想查看
io
模块的帮助程序,这些帮助程序让您只需实现一些原始的打开/读取/写入/关闭功能,并自动将其包装在一个完整的类似文件的对象中。* 实际上,他们所能做的就是取消链接您打开的目录条目。即使这是链接到该文件的唯一目录条目,该文件本身仍然存在,直到它的最后一个打开句柄关闭。
关于python - Python IO 是否允许在 Windows 上删除/重命名打开的文件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19280836/