我想读/写一个文件,但允许它被其他进程删除/重命名。 在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函数,并自动把它包装到一个完整的类文件对象中。
*实际上,他们所能做的就是取消你打开的目录条目 。 即使这是连接到该文件的唯一目录条目,文件本身仍然存在,直到最后一个打开的句柄关闭。