我正在用asp.net开发一个评论系统.用户可以使用“附加”按钮附加图像,并使用“发布”按钮发布评论.当用户附加图像时,开始上传图像. ASHX处理程序将上载的文件保存到“ 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.绑定事件时,我找不到将文件名作为参数传递的方法.简单来说,这是有问题的.我正在寻找一种更优雅的方式来删除一小时后上传的文件.
解决方法:
我会避免使用计时器,因为您将为每个文件创建一个计时器,这根本无法很好地扩展.
怎么样,在应用程序启动时启动的Web应用程序中的另一个线程上运行清理过程,每次会话到期时,该线程都会删除临时文件.这样,您无需计时器,因为每次会话到期时都会提示该过程.您将需要一个类来存储对该文件的引用(我想用唯一名称),该文件仍处于活动状态(这意味着它们所属的会话仍处于活动状态),清理过程可以检查该引用.
LMK如果您需要一些代码指针.