锁定文件防止覆盖ASP.NET中的文件

时间:2009-07-27 13:14:03

标签: asp.net exception file file-io

我有一个小型的C#ASP.NET Web应用程序,它可以从动态创建的.NET Chart控件生成多个PNG图像文件。这些用于:

  • 创建灯箱效果
  • 创建PDF
  • 创建Zip文件

应用程序使用率很低,数据经常更新,所以我在每次加载时重新创建所有内容。问题是,文件经常“正在使用”,并在我尝试覆盖时抛出异常。我不能有例外,因为需要显示正确的新版本的图表,而不是旧版本。我曾想过先删除,但仍有问题。因为页面每次都需要“正常工作”,所以我在每次刷新数据后都会手动删除图像文件,但这看起来很荒谬。我有这样的事情:

if(!System.IO.File.Exists(Server.MapPath(ImageFilename))) {
    chart.SaveImage(Server.MapPath(imageFilename), ChartImageFormat.Png);
}

对于PDF,我知道这样的事情很严重:

try
{
    Document doc = new Document();
    System.IO.File.Delete(Server.MapPath("charts.pdf"));
    PdfWriter.GetInstance(doc, new FileStream(Server.MapPath("charts.pdf"), FileMode.Create));
    doc.Open();
    ///ADD DATA
    doc.Close();
}
catch(Exception exc)
{}

如何解决文件问题并强制覆盖而不是手动或自动删除吞噬异常?我总是可以在资源管理器中删除。或者,我是否以错误的方式思考这个问题并尝试不同的方法?

3 个答案:

答案 0 :(得分:3)

您还需要查看正在读取文件的代码,从而导致文件未被使用错误。

是否使用锁打开文件?文件是否打开的时间超过了所需的时间?代码是否会导致错误导致文件保持打开状态?

如果文件已存在,您的FileMode.Create应删除该文件。

答案 1 :(得分:0)

如何创建具有不同名称的新文件,可能会在文件名后附加日期时间?此外,创建批处理文件或Windows服务以自动删除旧文件。

答案 2 :(得分:0)

即使目前使用高级Windows文件缓存,也没有什么可以阻止您的代码(尝试删除文件)与IIS重叠(尝试缓存/提供相同的文件),以防万一您没有对资源进行版本控制,你可以旋转并再试几次,但这并不容易实现,还取决于你的资源大小。我认为最好的实现方式是版本化+后台清理。