这是我的代码的一部分:
foreach (string str in Directory.GetFiles(MapPath("~/_Files/Upload/" + User.Identity.Name + "/"), "RS_*.*"))
{
MemoryStream ms = new MemoryStream();
System.Drawing.Image.FromFile(str).Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
cmd.Parameters.Clear();
cmd.CommandText = "INSERT INTO ReportingServiceImages VALUES (@ReportingServiceID, @img)";
cmd.Parameters.AddWithValue("@ReportingServiceID", ID);
cmd.Parameters.AddWithValue("@img", ms.GetBuffer());
cmd.ExecuteNonQuery();
ms.Close();
cmd.Dispose();
File.Delete(str);
}
当我尝试删除str
此IO Exeption时抛出:
该过程无法访问该文件' pdf'因为它正被另一个进程使用。
我该怎么办?
答案 0 :(得分:0)
当您尝试访问的文件未在代码的其他部分中正确关闭时,这些错误类型可能会出错。
在尝试访问之前请确保file is closed properly
希望这会有所帮助..
答案 1 :(得分:0)
当您使用数据库连接,文件等一次性对象时,请尝试使用以下
using(var file = new ...)
{
// code goes here
}
这样,当您完成与文件,数据库连接等相关的所有任务时,将处理相应的对象,随后在其他地方您可以创建另一个对象以再次访问您的文件。在文件的情况下发生这种情况的原因非常清楚。假设您已经打开了一个文件,如果您没有保存任何想要的文件然后将其释放,则无法创建另一个打开该文件的对象。如果可能的话,会出现很多不一致的地方。
答案 2 :(得分:0)
致电System.Drawing.Image.FromFile(str)
会创建一个需要处理的Image
foreach (string str in Directory.GetFiles(MapPath("~/_Files/Upload/" + User.Identity.Name + "/"), "RS_*.*"))
{
using(MemoryStream ms = new MemoryStream())
using(Image img = System.Drawing.Image.FromFile(str))
{
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
cmd.Parameters.Clear();
cmd.CommandText = "INSERT INTO ReportingServiceImages VALUES (@ReportingServiceID, @img)";
cmd.Parameters.AddWithValue("@ReportingServiceID", ID);
cmd.Parameters.AddWithValue("@img", ms.GetBuffer());
cmd.ExecuteNonQuery();
cmd.Dispose();
}
File.Delete(str);
}
如果cmd
实际上没有在此方法之外使用,我也会将其包装在using
语句中。我没有看到你的例子中的定义,因此不清楚它可能用于什么。