【问题标题】:load file to the server manipulate the file and then delete it after a period of time .net C#将文件加载到服务器操作文件然后在一段时间后将其删除.net C#
【发布时间】:2013-05-24 19:02:35
【问题描述】:

大家好,我的任务是创建一个允许最终用户将文件加载到我们的服务器之一的网络应用程序。然后服务器将处理该文件,然后将其返回给最终用户。服务器具有 IIS7 和 .net 框架 4 这是我的问题。 我已经弄清楚了所有事情,只是一旦我操作后我很难从服务器中删除文件。有没有一种方法可以让我在 30 分钟后设置一个计时器,以便在我的代码中从服务器中删除文件?还是有另一种解决方案来做到这一点? 我知道计时器建议可能没有意义,但是我想不出另一种方法来做到这一点,所以我正在寻找意见或其他方法。

【问题讨论】:

  • 如何将文件还给最终用户?该过程的最后一步可以删除文件吗?
  • 我喜欢在删除之前将文件保留 10 分钟,我也可以从服务器上的用户存储中获取文件,然后将其返回给他们,然后在 10 分钟后删除。跨度>

标签: c# asp.net c#-4.0


【解决方案1】:

计时器是安排未来某事的好方法。如果用户再次请求文件,您甚至可以重置计时器。只需给计时器一个委托,在计时器触发时删除文件。

【讨论】:

  • 我可以在不冻结界面思想的情况下做到这一点吗?有没有办法创建一个计时脚本?那会在它用完后执行代码吗?
  • @Miguel - 如果计时器在服务器上运行,如何冻结用户的浏览器?
  • @mbeckish 我会给他们一个可以下载文件的网址。
  • @mbeckish 我没有对服务器的管理员访问权限,我只能在我的特定站点的服务器上放置文件。我想知道的是我是否可以在用户单击按钮时运行计时器,并且它会继续无限期地运行以查找文件。
  • @mbeckish 如果无法更新代码或安装程序,您将无法做任何事情.. 没有任何“神奇的东西”可以通过单击按钮完成您想做的事情。. .
【解决方案2】:

您可以在服务器上设置计划任务吗?

这类事情对于简单的控制台应用程序来说是完美的,该应用程序只是删除修改日期/时间早于例如 now.AddMinutes(-10) 的文件。

如果您也喜欢,该任务可以每 10 分钟左右运行一次。

有时最好让这类事情远离您的网站。让您的网站为您的用户服务并创建其他东西来为您的服务器服务.. :)

更新 如果它是一个流量很大的网站,您可以在下次有人上传文件时删除所有旧文件。 所以:

用户选择要上传的文件,点击上传 -> 你得到文件 -> 你 删除旧文件(无论它们属于谁)->您操纵 文件 -> 文件将被下一个用户上传删除...

【讨论】:

  • 一开始我虽然是这么想的,但我被服务器管理员拒绝了,他说他不希望任何东西作为任务运行,这就是我提出问题的原因。
  • 他是个混蛋... :) 添加了另一个想法的更新。简而言之,由于多种原因,您将遇到困难 - 应用程序池可能会回收,杀死您激发执行此任务的任何线程,这只是首先想到的......
  • 他会让你在服务器上安装任何软件吗?你可以敲掉一些使用 WatchFolder 的东西。当它检测到一个新文件时,你可以让它删除旧文件。这不是计划任务,所以他的想法可能不会那么糟糕..
  • 我现在觉得很愚蠢。每次他们加载文件时,您都是对的,我可以删除文件夹中的文件。 :-D。谢谢你的想法!!!所以我在任何时候都应该在文件夹中只有一个文件。
  • 不用担心。有时很难只见树木不见森林 :)
【解决方案3】:

操作后为什么不删除呢?或者这个过程的最后一步是什么?这似乎是最好和最简单的方法。

根据数量,为 每个 文件执行单个任务可能不是一个好主意 - 您应该将它们批处理到队列中并让单个线程处理队列。

例如,您可以在 global.asax 中的spin up a background thread(可能是using a Timer)通过比较文件时间或其他方式来处理清理任务。

或者,作为该过程的第 1 步,您可以清理任何旧文件。不完全相同,但可能足够接近。

或者,您可以 abuse 缓存 remove callback 作为计时器。

【讨论】:

  • 我喜欢你在这里的想法,而且我对 global.asax 并不熟悉,所以我会对此进行研究。回到你首先说的是否可以只在内存中完成所有操作,换句话说,用户加载文件我从文件操作中检索数据以及如何给用户一个下载按钮?
  • @Miguel - 当然,您基本上可以在用户会话中存储一个字节数组,或者只是 Response.Binary 立即将其写出来。这回避了存储文件的问题。
【解决方案4】:

如果您可以确保应用始终保持运行,您可以跳过计划任务并使用Quartz.NET。在这种情况下,即使使用石英关闭它也不会那么糟糕 - 除非还有其他原因,在应用程序空闲时挂着一些旧文件不会造成伤害。

就处理这个问题而言,我会以适当的方式(例如——您的数据库)存储一个文件列表,并带有一个标记,以表明作业已完成以及已删除。然后,您的石英任务可以抓取标记为已完成但未标记为已删除的文件并清理它们。围绕文件删除和更新以及日志记录使用事务的奖励积分,以便您了解世界处于休眠状态时发生了什么。

【讨论】:

  • 谢谢怀亚特。从来不知道石英,但它似乎非常强大。我得再研究一下。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多