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

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

如果你想要一个跨平台的对等的话…真的没有一个。 在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) 

而且,不要只是把它粘在一个声明中,你必须明确地关闭它,用:

 win32file.CloseFile(f) 

如果你打算做很多这样的事情,把一个win32file文件句柄包装到一个win32file文件的对象中并不困难,而且可能是值得的。

最棘手的一点是决定你想保持多么接近open的参数,并编写代码来将你得到的值转换成CreateFile想要的值。 (Win32本地文件的处理方式与Win32 stdio文件的处理方式有些不同,但通常情况下这些都不会适用于您。)

你可能还想看一下io模块的helper,它可以让你实现一些原始的open / read / write / close函数,并自动把它包装到一个完整的类文件对象中。


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