删除关闭文件
使用的语言:C#
理论:我想在临时文件夹中创建一个带有FileOptions.DeleteOnClose标志的文件。 文件已成功创建,我将dato写入其中,下一步是启动与文件Process.Start(…)关联的应用程序,并允许用户检查文档,最后我关闭我的句柄,然后尽快其他进程关闭临时文件的句柄,该文件被操作系统删除。
我的问题是其他进程无法打开文件,即使是阅读,尽管我添加了FileShare.ReadWrite | FileShare.Delete到共享模式。
有什么建议?
其他进程在打开DeleteOnClose
文件时需要指定FileShare.Delete
从MSDN CreateFile文档:
“
FILE_FLAG_DELETE_ON_CLOSE
…对文件的后续打开请求失败,除非指定了FILE_SHARE_DELETE
共享模式。”
检查一下:
您需要确保所有进程都使用FileShare.ReadWrite和FileShare.Delete打开文件。
即使创建者使用share-readwrite打开,如果第二个程序尝试使用share-read打开,第二个程序基本上是说没有人可以写。 但是第一个程序已经拥有了这个权力,所以第二个程序失败了。
切换到Linux scnr
好吧,现在认真地说:这是Windows操作系统中的一个缺陷,无法真正解决。 打开文件的每个程序必须同意其他同时打开文件的程序。 这是我多年前在使用Windows时遇到的问题。 打开一个文件然后说:让别人打开它也是不够的。 其他人也必须说打开这个文件,即使它已经打开了。
相反,在Linux上,操作系统不允许以Windows的方式锁定任何文件。 这里,如果同时由多个程序使用任何文件,程序本身必须确保并发访问被锁定。 此外,在Linux上,我们可以只创建文件,确保已启动其他进程并打开文件,然后只删除文件(当它打开时)。 然后立即从文件系统中删除文件名,但该文件仍由文件系统驱动程序维护,直到最后一个链接(包括打开的文件句柄)被删除。
回到你的问题:由于所有这些在Windows上都不起作用,你可以做另外两种方法:
- 在下次启动时注册要删除的文件(在Win3x期间,win.ini中有一个部分用于此。较新的Windows版本仍然支持,我不记得了,现在如何完成)。
- 启动其他进程,等待它打开文件,关闭文件,然后尝试每分钟删除文件,直到删除成功…
此致,Bodo