【问题标题】:Locks on Files Preventing Overwriting Files in ASP.NET锁定文件防止覆盖 ASP.NET 中的文件
【发布时间】:2009-07-27 13:14:03
【问题描述】:

我有一个小型 C# ASP.NET Web 应用程序,它从动态创建的 .NET 图表控件生成多个 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)
{}

如何解决文件问题并强制覆盖而不是手动或自动删除并出现吞咽异常?我总是可以在资源管理器中很好地删除。或者,我是否认为这是错误的方式,应该尝试不同的策略?

【问题讨论】:

    标签: asp.net exception file file-io


    【解决方案1】:

    您还需要查看正在读取文件并因此导致文件未使用错误的代码。

    文件是用锁打开的吗?文件打开的时间是否比需要的时间长?代码是否会导致错误导致文件保持打开状态?

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

    【讨论】:

    • 文件访问是您处理非托管资源的事情之一 - 您需要确保在处理完这些对象后调用 Dispose:
    • @Zhaph - 谢谢。 Dispose 为我做了这件事。我在“使用”子句之外打开了位图对象
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-08-26
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 2020-12-28
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 2012-05-13
        相关资源
        最近更新 更多