在我的程序中,我通过拖放到我的表单上收到.eml
个文件。
我可以毫无问题地存储此文件。此外,当重新打开已删除的.eml
文件的(副本)时,我可以在默认应用程序(即默认邮件客户端)中打开它。
我可以看到附件,但是,当试图打开它们时,没有任何反应。
有没有办法将封装邮件的附件封装到.eml
文件中?
我知道我可以简单地将附件存储在某处,但是,我必须修改.eml
以考虑新的位置,这是一个麻烦,在我的情况下,我会真想避免...
编辑:
- 通过将文件转换为.eml
数组来存储byte[]
文件,然后将其存储到数据库中。
byte[] savedToDB = File.ReadAllBytes(docPath);
通过以下(伪)代码预览文件:
1)从数据库加载byte[]
数组
2)使用以下代码保存为临时文件:
string tmpPath = System.IO.Path.GetTempFileName().Replace(".tmp", ".eml");
using (FileStream fs = new FileStream(tmpPath, FileMode.Create, FileAccess.Write)) {
fs.Write(bytesFromDB, 0, bytesFromDB.Length);
fs.Close();
}
File.SetAttributes(@tmpPath, File.GetAttributes(tmpPath) | FileAttributes.Temporary);
if (File.Exists(tmpPath)) {
System.Diagnostics.Process p = System.Diagnostics.Process.Start(path);
}
更新2 问题似乎在于我显示文件的方式,而不是我存储它的方式。
实际上,我的代码如下:
// see code above for storing the temporary file...
// replace the following line
// System.Diagnostics.Process p = System.Diagnostics.Process.Start(path);
// by following code...
var worker = new BackgroundWorker();
worker.WorkerReportsProgress = false;
worker.WorkerSupportsCancellation = false;
worker.DoWork += (s, e) => {
System.Diagnostics.Process p = System.Diagnostics.Process.Start(path);
// wait 1 second at least!
System.Threading.Thread.Sleep(1000);
p.WaitForExit();
};
worker.RunWorkerCompleted += (s, e) => {
File.Delete(path);
};
问题是BackgroundWorker
在预览窗口仍处于打开状态时终止 - 这会删除临时文件,因此会丢失附件的路径。
所以我的问题是:有没有正确的方法来确保文件在关闭后被删除?如果没有,系统会自动刷新临时文件(在临时文件夹中),如果是,何时?
我需要确保打开的文件没有堆积到客户端的磁盘上......