Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 进程无法访问文件';pdf';因为它正被另一个进程使用_C#_Process - Fatal编程技术网

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

C# 进程无法访问文件';pdf';因为它正被另一个进程使用,c#,process,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)

这是我代码的一部分:

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例外抛出时:

进程无法访问文件“pdf”,因为另一进程正在使用该文件


我能做什么?

当您试图访问的文件在代码的其他部分未正确关闭时,这些类型的错误可能会出错

在尝试访问
文件之前,请确保该文件已正确关闭


希望这对您有所帮助。

当您使用一次性对象(如数据库连接、文件等)时,请尝试使用以下方法

using(var file = new ...)
{
    // code goes here
}

这样,当您完成与文件、数据库连接等相关的所有任务时,相应的对象将被释放,随后您可以在其他位置创建另一个对象以再次访问您的文件。在文件的情况下发生这种情况的原因非常清楚。假设您已经打开了一个文件,如果您不在那里保存任何您想要的内容,然后将其释放,则无法创建另一个打开此文件的对象。如果可能的话,会出现许多不一致之处

调用
System.Drawing.Image.FromFile(str)
将创建需要处理的

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
实际上没有在这个方法之外使用,我也会使用
语句将它包装在
中。我在你的例子中看不到这个定义,所以不清楚它还有什么用途