【发布时间】:2010-11-21 10:52:48
【问题描述】:
我认为这很简单。我的程序将使用自动化在服务器上创建一个 Excel 文件。之后,我想强制用户选择是否下载它,然后,无论选择如何,删除文件,这样它就不会占用空间。关于如何实现这一点的任何想法?
【问题讨论】:
标签: c# asp.net excel automation delete-file
我认为这很简单。我的程序将使用自动化在服务器上创建一个 Excel 文件。之后,我想强制用户选择是否下载它,然后,无论选择如何,删除文件,这样它就不会占用空间。关于如何实现这一点的任何想法?
【问题讨论】:
标签: c# asp.net excel automation delete-file
您可以将文件读入输入缓冲区,然后删除文件并将缓冲区而不是实际文件发送给用户。
【讨论】:
很难知道用户何时真正完成下载文件,并且您不想在这样做之前将其删除,因此我的建议是删除超过一定时间的文件,例如 > 24 小时.
很难确定用户是否已完成下载文件,因为浏览器不传输此信息,除了数据包嗅探网络数据并详细配置您的网络服务器以管理其打开的连接,并且实际上相信它赢了不要犯错,没有简单的方法。
这还取决于您读取文件的方式及其实际大小,例如逐行输出到浏览器会节省内存,但它会使代码依赖于文件的存在,同时读取文件的将内容保存到某种缓冲区将使网络服务器能够很好地为其提供服务,但根据访问者的数量、文件大小和平均下载速度,您可能随时拥有一个在内存中具有数十 GB 文件的网络服务器。
拥有足够的空间来存储几天的数据并不时删除文件会更容易。
【讨论】:
一个非常好的方法,在你的 global.asax 中
我认为 SO 使用了类似的东西,虽然我忘记了是为了什么......(我确定我从他们那里偷走了这段代码)
private static CacheItemRemovedCallback OnCacheRemove = null;
private void AddTask(string name, int seconds)
{
OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved);
HttpRuntime.Cache.Insert(name, seconds, null, DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, OnCacheRemove);
}
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
// delete old spreadsheets every hour
AddTask("DeleteDayOldSpreadsheets", 3600);
}
public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r)
{
// do stuff here
switch (k)
{
case "DeleteDayOldSpreadsheets":
// TODO: add your magic DELETE OLD SPREADSHEET code here
break;
default:
break;
}
// re-add our task so it recurs
AddTask(k, Convert.ToInt32(v));
}
【讨论】:
我知道这个问题已经问过一段时间了,但我认为这个提示会很有用。
以下是可以解决问题的 C# 代码。
关于更多信息,我已经指出了我从中找到原始想法的参考链接。这对我很有帮助。
private void DownloadFile()
{
Response.ContentType = ContentType;
Response.AppendHeader("Content-Disposition", "attachment; filename=myFile.txt");
Response.WriteFile(Server.MapPath("~/uploads/myFile.txt"));
Response.Flush();
// Delete the file just before execute Response.End()
System.IO.File.Delete(Server.MapPath("~/uploads/myFile.txt"));
Response.End();
}
【讨论】:
如Microsoft KB 257757 中所述,Microsoft 建议不要在服务器上使用自动化:
"Microsoft 目前不推荐也不支持任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为在此环境中运行 Office 时,Office 可能会出现不稳定的行为和/或死锁。"
SpreadsheetGear for .NET 和其他 3rd 方库可以做到这一点,它们会更快更可靠。 SpreadsheetGear 支持直接写入输出流,因此您无需在磁盘上创建临时文件 - 提供更好的性能,无需担心清理剩余文件。
如果您想亲自试用,可以查看带有 C# 和 VB 源代码的 ASP.NET Excel 报告示例here 并下载免费试用版here。
免责声明:我拥有 SpreadsheetGear LLC
【讨论】: