gpt4 book ai didi

python - Python IO 是否允许在 Windows 上删除/重命名打开的文件?

转载 作者:可可西里 更新时间:2023-11-01 09:47:57 29 4
gpt4 key购买 nike

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

最佳答案

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

Python 的标准文件对象不允许您直接控制 Windows 共享标志。 (这是因为它们使用像 stdio 的 fopen 这样的跨平台 API,而不是特定于 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com