删除关闭文件

时间:2009-02-13 14:08:21

标签: c# file filesystems temporary-files

使用的语言:C#

理论值: 我想在临时文件夹中创建一个带有FileOptions.DeleteOnClose标志的文件。 该文件已成功创建,我将dato写入其中,下一步是启动与文件Process.Start(...)关联的应用程序,并允许用户检查文档,最后我关闭我的句柄,然后尽快其他进程关闭临时文件的句柄,该文件被操作系统删除。

我的问题是其他进程无法打开文件,即使是为了阅读,尽管我添加了FileShare.ReadWrite | FileShare.Delete到共享模式。

有什么建议吗?

3 个答案:

答案 0 :(得分:18)

其他进程在打开FileShare.Delete文件

时需要指定DeleteOnClose

来自MSDN CreateFile文档:

  

FILE_FLAG_DELETE_ON_CLOSE ...对文件的后续打开请求失败,除非指定了FILE_SHARE_DELETE共享模式。”

答案 1 :(得分:0)

检查一下:

您需要确保所有进程使用FileShare.ReadWrite和FileShare.Delete打开文件。

即使创建者使用share-readwrite打开,如果第二个程序尝试使用share-read打开,第二个程序基本上是说没有人可以写。但是第一个程序已经拥有了这个权力,所以第二个程序失败了。

答案 2 :(得分:-6)

切换到Linux scnr

好的,现在认真地说:这是Windows操作系统中的一个缺陷,无法真正解决。打开文件的每个程序必须同意其他同时打开文件的程序。这是我多年前在使用Windows时遇到的问题。打开一个文件然后说:让别人打开它也是不够的。其他人也必须说打开这个文件,即使它已经打开了。

在Linux上相反,操作系统不允许以Windows的方式锁定任何文件。这里,如果同时由多个程序使用任何文件,程序本身必须确保并发访问被锁定。另外,在Linux上,我们可以创建文件,确保已启动其他进程并打开文件,然后只删除文件(当它打开时)。然后立即从文件系统中删除文件名,但该文件仍然由文件系统驱动程序维护,直到最后一个链接(包括打开的文件句柄)被删除。

回到你的问题:因为所有这些在Windows上都不起作用,你可以做另外两种方法:

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