我想读/写一个文件,但允许其他进程删除/重命名.在C#你可以用一个打开文件FileShare.Delete,Python有一个等价的吗?
如果你想要一个跨平台的等价物......真的没有一个.在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)
Run Code Online (Sandbox Code Playgroud)
然后,而不是buf = f.read(4096),你做:
buflen, buf = win32file.ReadFile(f, 4096, None)
Run Code Online (Sandbox Code Playgroud)
并且,不要只是将其粘贴在一个with语句中,而是必须明确地将其关闭,其中:
win32file.CloseFile(f)
Run Code Online (Sandbox Code Playgroud)
如果你计划做很多这样的事情,win32file在一个类似文件的对象中包装句柄并不是那么难,而且可能值得做.
最棘手的一点是决定你想要坚持参数的接近程度open,并编写代码来转换你CreateFile想要的值.(还有一些边缘情况,Win32本机文件处理不同于Win32 stdio文件,但通常这些不会咬你.)
您可能还希望查看io模块中的帮助程序,它们可以让您实现一些原始的打开/读/写/关闭函数,并自动将其包装在一个完整的类文件对象中.
*实际上,他们只能取消您打开的目录条目的链接.即使这是链接到该文件的唯一目录条目,文件本身仍然存在,直到关闭它的最后一个打开句柄.
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |