我正在使用asp.net开发一个评论系统。用户可以使用"附加"附加图像。按钮并发表评论" Post"按钮。当用户附加图像时,将开始上载图像。 ASHX处理程序将上传的文件保存到" temp"夹。如果用户点击"发布"按钮,我将图像移动到一个安全的地方。如果他没有点击"发布",关闭浏览器并离开,该文件将保留在" temp"夹。如何从此" temp"中删除文件?文件夹上传一小时后?
详细信息: 我想在用于上传的ashx文件中使用System.Timers.Timer
System.Timers.Timer timer = new System.Timers.Timer(300);
string fileName;
public void Cleaner()
{
System.Timers.Timer timer = new System.Timers.Timer(300); //3 second
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Start();
}
protected void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs a)
{
timer.Stop();
timer.Close();
string path = "temp";
string mapPath = HttpContext.Current.Server.MapPath("../" + path);
FileInfo TheFile = new FileInfo(mapPath + "\\" + fileName);
if (TheFile.Exists) File.Delete(mapPath + "\\" + fileName);
}
public void ProcessRequest(HttpContext context)
{
//Saving uploaded file
Cleaner();
}
但我觉得我做得不对。
计时器在3秒后滴答,但timer_Elapsed()函数中的HttpContext.Current返回null。此外,文件名在计时器滴答后也返回null。在绑定事件时,我无法找到将文件名作为参数传递的方法。简单来说,这是有问题的。我正在寻找一种更优雅的方法来在一小时后删除上传的文件。
答案 0 :(得分:2)
我会避免使用计时器,因为你会为每个文件创建一个计时器,它根本不能很好地扩展。
如何做到这一点,在应用启动时启动的Web应用中的另一个线程上运行清理过程,每次会话到期时都会删除临时文件。这样您就不需要计时器,因为每次会话到期时都会提示进程。你需要一个类来存储一个引用(我猜的唯一名称)到仍然存在的文件(我的意思是它们所属的会话仍然存在),清理进程可以检查。
LMK如果你想要一些代码指针。
答案 1 :(得分:1)
HttpContext.Current应该为null,因为一旦发送响应,上下文就会。
如果您使用的是unix,我建议编写脚本并使用cron运行。但似乎你正在使用Windows。
因此,编写一个程序(exe),它根据创建日期从临时目录中删除文件(甚至更好的图像文件)。谷歌,你会发现很多教程如何做到这一点。删除文件是一行代码。如果您使用的是系统临时目录,那么这是另一行代码。如果您使用自定义临时目录,则您已经知道路径。 如果要检查创建时间属性(或上次修改时间属性),则需要多写几行。
现在,使用Windows任务管理器根据您的要求安排exe。或者您可以使用可用于Windows的第三方任务管理器。