问题是,当用户双击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应用程序时删除临时文件。
答案 0 :(得分:5)
嗯,你有两个问题:
执行#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)
我会采取另一种方法: