2010-12-08 14 views
1

我正在从SQL服务器读取文件并将其临时写入磁盘,以便其他程序可以访问它。使用Path.GetTempFileName()很容易。使用(FileStream)创建临时文件导致“进程无法访问该文件,因为它正在被使用”

我的问题是,我需要这些临时文件删除后,一旦进程已完成。我这样做是与FileStream类,如:

using (FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None, 8, FileOptions.DeleteOnClose)) 
{ 
    //code here ultimately accessing the temp file 
} 

随着fileOptions集,一旦使用结束,的FileStream配置文件被删除。该文件明确创建和删除的提示,但访问该文件的任何程序与响应“的过程,因为它正在使用无法访问文件...”

可以理解,如果我的FileStream仍然可以访问文件(我试过修改FileShare没有成功;这个过程不是文件流。)

我希望避免使用删除方法(这将需要更多的错误捕获)。是否有一种简单的方法(利用FileStream)创建我的临时文件并在其他进程完成后将其删除?

+0

工作只是为了确认,如果使用FileShare.ReadWrite,你仍然有问题? – 2010-12-08 14:57:58

+0

确认。文件仍在使用中(其他进程不是FileStream)。 – MoSlo 2010-12-08 15:02:49

+0

你有任何控制其他应用程序?你怎么知道文件被读取的时间? – 2010-12-08 15:14:10

回答

0

我没有看到使用using语句的可能性,但您可以使用Process.WaitForExit()方法等待另一个进程结束,之后您可以安全地删除该文件。

-1

在using子句关闭之前使用流的Close()方法关闭th fileStream。

0

如果您在Windows操作系统上运行,DeleteOnClose实际上是由FILE_FLAG_DELETE_ON_CLOSE标志传递给CreateFile Function

文档备份表示:“文件将被立即删除其所有句柄被关闭后,其中包括指定的句柄和任何其他打开或重复的句柄。“

因此,您需要在FileStream的Handle或SafeFileHandle属性上调用DuplicateHandle(doc here)。你应该可以在使用中做到这一点。这是在C#DuplicateHandle声明的一个可能性:

[DllImport("kernel32.dll", SetLastError = true)] 
public static extern bool DuplicateHandle(
    IntPtr hSourceProcess, 
    SafeFileHandle hSourceHandle, 
    IntPtr hTargetProcessHandle, 
    out IntPtr hTargetHandle, 
    uint dwDesiredAccess, 
    bool fInheritHandle, 
    uint dwOptions); 

我没有测试过这一点,但它有很好的机会:-)

相关问题