FileStream会自动删除临时文件吗?

Grm*_*hel 3 c# filestream winforms

我有点搜索,但找不到令人兴奋地解决我问题的东西.我有一些代码,来自我的数据库的FileStream varbinary,并将其转换为客户端计算机上的文件,双击时可以在默认应用程序中查看文件类型,并在单击下载时下载到客户端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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多...我也尝试使用Process.WaitForExit()方法,但是当我使用它时,我的PDF应用程序给出了以下错误消息:

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

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

Mik*_*all 5

那么,你有两个问题:

  1. 您需要在启动外部流程之前关闭流.这就是您从Acrobat获取"正在使用中的文件"错误的原因.
  2. 在做#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();   
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)