15

使用语言:C#

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

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

有什么建议么?

4

3 回答 3

19

其他进程需要指定FileShare.Delete何时打开DeleteOnClose文件

MSDN CreateFile文档:

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

于 2009-02-13T15:37:43.333 回答
0

检查这个:

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

即使创建者使用 share-readwrite 打开,如果第二个程序尝试使用 share-read 打开,第二个程序基本上是说没有其他人可以写。但是第一个程序已经具有该功能,因此第二个打开失败。

于 2009-02-13T14:34:01.083 回答
-7

切换到 Linux scnr

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

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

回到您的问题:由于所有这些都不适用于 Windows,您可以执行其他两种方法:

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

问候, 博多

于 2009-02-13T14:25:28.173 回答