删除关闭文件

使用的语言: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上都不起作用,你可以做另外两种方法:

  1. 在下次启动时注册要删除的文件(在Win3x期间,win.ini中有一个部分用于此。较新的Windows版本仍然支持,我不记得了,现在如何完成)。
  2. 启动其他进程,等待它打开文件,关闭文件,然后尝试每分钟删除文件,直到删除成功…

此致,Bodo