我有一个小型的C#ASP.NET Web应用程序,它可以从动态创建的.NET Chart控件生成多个PNG图像文件。这些用于:
应用程序使用率很低,数据经常更新,所以我在每次加载时重新创建所有内容。问题是,文件经常“正在使用”,并在我尝试覆盖时抛出异常。我不能有例外,因为需要显示正确的新版本的图表,而不是旧版本。我曾想过先删除,但仍有问题。因为页面每次都需要“正常工作”,所以我在每次刷新数据后都会手动删除图像文件,但这看起来很荒谬。我有这样的事情:
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)
{}
如何解决文件问题并强制覆盖而不是手动或自动删除吞噬异常?我总是可以在资源管理器中删除。或者,我是否以错误的方式思考这个问题并尝试不同的方法?
答案 0 :(得分:3)
您还需要查看正在读取文件的代码,从而导致文件未被使用错误。
是否使用锁打开文件?文件是否打开的时间超过了所需的时间?代码是否会导致错误导致文件保持打开状态?
如果文件已存在,您的FileMode.Create应删除该文件。
答案 1 :(得分:0)
如何创建具有不同名称的新文件,可能会在文件名后附加日期时间?此外,创建批处理文件或Windows服务以自动删除旧文件。
答案 2 :(得分:0)
即使目前使用高级Windows文件缓存,也没有什么可以阻止您的代码(尝试删除文件)与IIS重叠(尝试缓存/提供相同的文件),以防万一您没有对资源进行版本控制,你可以旋转并再试几次,但这并不容易实现,还取决于你的资源大小。我认为最好的实现方式是版本化+后台清理。