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

时间:2011-02-22 16:04:07

标签: c# winforms filestream

我已经搜索了一下,但找不到令人兴奋地解决我问题的东西。 我有一些代码,来自我的数据库的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();
    }
}

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

  

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

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

3 个答案:

答案 0 :(得分: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();   
        }
    }
    

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我会采取另一种方法:

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