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

Posted

技术标签:

【中文标题】Python IO 是不是允许在 Windows 上删除/重命名打开的文件?【英文标题】:Does Python IO allow opened file to be deleted/renamed on Windows?Python IO 是否允许在 Windows 上删除/重命名打开的文件? 【发布时间】:2013-10-17 07:57:51 【问题描述】:

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

【问题讨论】:

【参考方案1】:

如果您想要一个跨平台的等价物……真的没有。在 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 模块中的帮助程序,这些帮助程序让您只需实现少数原始的打开/读取/写入/关闭函数并自动将其包装在一个完整的类似文件的对象中。


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

【讨论】:

这是因为他们使用跨平台 API,例如 stdio 的 fopen,而不是特定于 Windows 的 API 它有可能被修复 - 请参阅 Add new io.FileIO using the native Windows API。顺便说一句,在这种情况下使用跨平台 API 如何防止跨平台是很有趣的 ;) @PiotrDobrogost:嗯,它允许像 Microsoft 关心的那样跨平台;如果你想自己超越它,它会阻碍......顺便说一句,在 3.x 中,Python 使用 POSIX/MSVCRT API,如open,而不是 stdio API。从理论上讲,这应该更容易改变为使用 Win32 API,但这将是一个相当大的改变;除非您可以在任何地方用 HANDLE 替换 fd,并为 MSVCRT 在 fd 之上模拟的所有内容编写新代码,否则它不能成为直接替换,而只是一个单独的类似文件的类型。但我有点惊讶没有人使用 PyPI 开发那种单独的类型……

以上是关于Python IO 是不是允许在 Windows 上删除/重命名打开的文件?的主要内容,如果未能解决你的问题,请参考以下文章

烧瓶套接字 io 不工作(Windows 7 和 10)anaconda 和 python 3.7

CPython 是不是允许在 Windows 10 中的 C# 中导入 OpenCV 和 Tesseract-OCR?

标准的 windows .ini 文件是不是允许注释?

cacti监控linux和windows磁盘IO

Windows 10 不断提示是不是允许使用精确位置

windows下的IO模型之事件选择(WSAEventSelect)模型