我想读取/写入文件,但允许其他进程删除/重命名。在C#
中,您可以使用FileShare.Delete
打开文件,Python是否具有等效文件?
答案 0 :(得分:6)
如果你想要一个跨平台的等价物......真的没有。在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
模块中的帮助程序,它们可以让您实现一些原始的打开/读/写/关闭函数,并将其自动封装在一个完整的类文件对象中。 / p>
*实际上,他们只能取消链接您打开的目录条目。即使这是链接到该文件的唯一目录条目,文件本身仍然存在,直到它的最后一个打开句柄被关闭。