我正在用 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。绑定(bind)事件时,我找不到将文件名作为参数传递的方法。很简单,这是有问题的。我正在寻找一种更优雅的方式来在一小时后删除上传的文件。
最佳答案
我会避免使用计时器,因为您将为每个文件创建一个计时器,这根本无法很好地扩展。
怎么样,在应用程序启动时启动的网络应用程序中的另一个线程上运行清理过程,每次 session 过期时都会删除临时文件。这样您就不需要计时器,因为每次 session 过期时都会提示该过程。您将需要一个类来存储对仍然存在的文件的引用(我猜是唯一的名称)(我的意思是它们所属的 session 仍然存在),clean 进程可以检查这些文件。
LMK,如果你想要一些代码指针。
关于c# - 删除上传的文件,如果它没有移动到另一个文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8587815/