C# FileStream是否自动删除临时文件?

C# FileStream是否自动删除临时文件?,c#,winforms,filestream,C#,Winforms,Filestream,我四处搜索了一下,但找不到能很好地解决我问题的东西。 我有一些代码,来自我的数据库的FileStream VARBINAL,并将其转换为客户端计算机上的文件,双击时可在默认应用程序中查看该文件类型,单击下载btn时可下载到客户端PC 问题是,当用户双击Listview中的一个项目(例如mydocument.docx)时,我的代码会给它一个临时名称,并将其存储在客户机上的临时目录中。但是这个文件不会再被删除了?!在这些情况下,如何使刚刚创建的临时文件再次自动删除: 1.用户关闭相关的应用程序(例如

我四处搜索了一下,但找不到能很好地解决我问题的东西。 我有一些代码,来自我的数据库的FileStream VARBINAL,并将其转换为客户端计算机上的文件,双击时可在默认应用程序中查看该文件类型,单击下载btn时可下载到客户端PC

问题是,当用户双击Listview中的一个项目(例如mydocument.docx)时,我的代码会给它一个临时名称,并将其存储在客户机上的临时目录中。但是这个文件不会再被删除了?!在这些情况下,如何使刚刚创建的临时文件再次自动删除: 1.用户关闭相关的应用程序(例如Word for.docx),之后将再次删除临时文件。 2.用户关闭Winform窗口,该窗口将删除临时文件。 3.程序创建的所有临时文件将在下次重新启动时删除

我更喜欢案例1,但不确定是否可行

源代码如下所示:

public void WriteFile(string filePath, StoredFile file, bool tempLocation)
{
    byte[] data = file.FilContent.ToArray();
    FileStream fileStream;
    string tempName = Path.GetRandomFileName(), strPath;
    if (tempLocation)
         strPath = String.Format(@"{0}{1}{2}", Path.GetTempPath(), tempName, file.FilExt);
    else
         strPath = String.Format(@"{0}{1}", filePath, file.FilExt);
    fileStream = new FileStream(strPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None, 512, FileOptions.DeleteOnClose);

    try
    {
         fileStream.Write(data, 0, data.Length);
         fileStream.Flush();

         if (tempLocation)
            System.Diagnostics.Process.Start(@strPath);
    }
    finally
    {
         fileStream.Close();
    }
}
我试了很多。。。我还尝试使用Process.WaitForExit()方法,但当我使用它时,我的PDF应用程序会显示以下错误消息:

打开此文档时出错。此文件已打开或正在被其他应用程序使用


FileOptions.DeleteOnClose无法正常工作。。。。我希望在流程应用程序关闭时删除临时文件。

一个解决方案是使用计时器定期删除预定义位置中的所有文件。

嗯,您有两个问题:

  • 您需要在启动外部进程之前关闭流。这就是为什么您从Acrobat收到“正在使用的文件”错误
  • 在执行#1之后,Process.WaitForExit()应该像您预期的那样工作

    public void WriteFile(string filePath, StoredFile file, bool tempLocation)
    {
     // [snip..]
        try
        {
             fileStream.Write(data, 0, data.Length);
             fileStream.Flush();
             fileStream.Close();
    
             if (tempLocation)
             {
                Process p = System.Diagnostics.Process.Start(@strPath);
                p.WaitForExit();
                File.Delete(strPath);
             }
        }
        finally
        {
            if (fileStream != null)
              fileStream.Dispose();   
        }
    }
    

  • 我会采取另一种方法:要么

    • 让用户决定文件名和位置,您将永远不必删除或删除它
    • 使用临时目录中的子文件夹,并在应用程序启动时清空/重新创建它

    您正在启动该过程,而文件仍处于打开状态。这很容易解决。使用Process.Exited事件来清理临时文件。谢谢,这非常有效!从逻辑上讲,在流程应用程序中使用流之前必须先关闭它,但我没有考虑它,因为当您只想打开文件时,它实际上在finally语句中与close一起工作。