2009-02-13 86 views
13

使用语言:C#删除在关闭文件

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

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

有什么建议吗?

回答

17

的其他进程需要指定FileShare.Delete,当他们打开DeleteOnClose文件

MSDN CreateFile文档:

FILE_FLAG_DELETE_ON_CLOSE ......随后打开该文件请求失败,除非FILE_SHARE_DELETE共享模式被指定“。

-6

切换到Linux SCNR

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

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

回到你的问题:由于这一切在Windows doen't工作,你可以做其他两种方法:

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

问候,博多

+1

但是一般的Unix(不是Linux的某些特性,也可能是Linux)没有'delete when file finally finally'选项。 – 2009-02-13 14:35:54

+1

这是因为即使打开它也可以删除它。只要每个需要它的人都有处理,事情就会解决。 – 2009-02-13 14:46:26

-1

我想要创建一个带有标志的文件 FileOptions.DeleteOnClosed在 临时文件夹中。

我闭上我的把手,一旦其他 过程中关闭句柄 临时文件,该文件被 操作系统中删除。

请详细说明。这个文件如何被操作系统删除。如果你的意思是通过代码删除它。为什么不保存文件流。然后你可以用Process打开它。启动

+0

它是Windows上的一个选项 - 最近在另一个SO问题中讨论过,我现在找不到它。 – 2009-02-13 14:35:14

0

检查:

你需要确保所有过程正在打开与FileShare.ReadWrite和FileShare.Delete文件。

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

+0

但是,创建者可以创建该文件,然后关闭它并使用共享只读重新打开该文件。最后,问题并不在于由两个进程同时打开该文件,而在于如何实现该自动删除。 – 2009-02-13 15:12:47