该过程无法访问该文件&#pdf'因为它正被另一个进程使用

时间:2013-12-20 13:23:18

标签: c# process

这是我的代码的一部分:

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'因为它正被另一个进程使用。

我该怎么办?

3 个答案:

答案 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语句中。我没有看到你的例子中的定义,因此不清楚它可能用于什么。