临时保存,打开,然后在关闭时删除

时间:2015-03-06 22:25:17

标签: c# file process

我需要暂时保存并打开下载的文件。产品所有者声明的需要是不必通过文件保存对话框来检索这些文件,也不必让文件无限期地放在他们的硬盘上。

为此,我在下载这些文件时实现了“仅查看”选项。使用时,文件将使用默认文件名保存到用户的Temporary Internet Files目录中,然后使用Process.Start(fileName)使用默认程序打开。此行为模仿我的桌面应用程序所基于的Web UI。

这是问题所在。用户希望我更进一步,当程序打开以查看文件被用户关闭时,立即删除该文件。 “没问题”,我想,并编写了以下代码:

    protected static readonly ConcurrentDictionary<int, Process> OpenFileViewers 
        = new ConcurrentDictionary<int, Process>();

    protected void LaunchFileAndWatch(string fileName, Action<string> closeFileCallback)
    {
        try
        {
            var process = Process.Start(fileName);

            OpenFileViewers.TryAdd(process.Id, process);

            process.WaitForExit();

            OpenFileViewers.TryRemove(process.Id, out process);

            closeFileCallback(fileName);

        }
        catch (Exception ex)
        {
            HandleExceptionInUIThread(ex);
        }
    }

    protected virtual void HandleExceptionInUIThread(Exception ex)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<Exception>(HandleExceptionInUIThread), ex);
            return;
        }

        //TODO: Whatever we want to do with the exception; for now, throw it out to ThreadException handler
        throw ex;
    }

    protected void DeleteFile(string fileName)
    {
        try
        {
        File.Delete(fileName);
        }
        catch (Exception ex)
        {
            HandleExceptionInUIThread(ex);
        }
    }

...

((Action<string, Action<string>>)LaunchFileAndWatch).BeginInvoke(downloadedFileName, DeleteFile, null, null);

ConcurrentDictionary允许我在应用程序关闭时关闭任何打开的查看器程序(如果用户愿意),这样也可以删除文件。

问题是,当Process.Start()的调用实际上没有启动新进程时,此代码失败。我不知道会发生这种情况,但显然shell会重用现有进程,当发生这种情况时,你不会从任何版本的Process.Start中获取进程信息,无论是静态还是实例。 / p>

在这种情况下,文件未被删除且用户不满意。

有没有办法可以使用Process.Start打开文件,这会强制Windows让我控制进程,而不必放弃使用Windows的默认程序数据库?

0 个答案:

没有答案