2012-03-01 146 views
0

我有一个按钮,将图像保存到数据库和一个函数,将删除目录是我保存图像临时保存到数据库之前。
这里是代码System.IO.IOException:进程无法访问文件

private void btnSave_Click(object sender, EventArgs e) 
    { 
     imgTemp = new System.Windows.Forms.PictureBox(); 
     imgTemp.Image = Image.FromFile(@cwd + "\\Final.jpg"); 
     MemoryStream mstr = new MemoryStream(); 
     imgTemp.Image.Save(mstr, imgTemp.Image.RawFormat); 
     byte[] arrImage = mstr.GetBuffer(); 
     //Set insert query 
     imgTemp.Image = null; 
     imgTemp.Dispose(); 

     string qry = "insert into FinalImages (FinalImageName, FinalImage, Parts) values(@FinalImageName, @FinalImage, @Parts)"; 

     SqlConnection c = new SqlConnection(c_string); 
     //Initialize SqlCommand object for insert. 
     SqlCommand SqlCom = new SqlCommand(qry, c); 

     //We are passing Original Image Path and Image byte data as sql parameters. 
     SqlCom.Parameters.Add(new SqlParameter("@FinalImageName", SqlDbType.Char, 40)).Value = textBox1.Text + ".jpg"; 
     SqlCom.Parameters.Add(new SqlParameter("@FinalImage", SqlDbType.Image)).Value = arrImage; 
     SqlCom.Parameters.Add(new SqlParameter("@Parts", SqlDbType.VarChar, 40)).Value = NumOfFiles; 

     try 
     { 
      c.Open(); 
      SqlCom.ExecuteNonQuery(); 
     } 
     catch (System.Data.SqlClient.SqlException err) 
     { 
      MessageBox.Show(err.Message); 
     } 
     finally 
     { 
      c.Close(); 
     } 

     // How many Picture files in this folder 
     imgArray2 = new System.Windows.Forms.PictureBox[NumOfFiles]; 
     for (int i = 0; i < NumOfFiles; i++) 
     { 
Bitmap(imgName[i]); 
      imgArray2[i] = new System.Windows.Forms.PictureBox(); 
      imgArray2[i].Image = Image.FromFile(imgName[i]); 
      string name2 = textBox1.Text + ".jpg"; 
      string name3 = imgName[i].Substring(imgName[i].LastIndexOf(@"\") + 1,   imgName[i].Length - imgName[i].LastIndexOf(@"\") - 1); 
      MemoryStream mstr2 = new MemoryStream(); 
      imgArray2[i].Image.Save(mstr2, imgArray2[i].Image.RawFormat); 
      byte[] arrImage2 = mstr2.GetBuffer(); 
      string cmd2 = "insert into ImageParts (FinalImageName, ImagePartName, ImagePart) values (@FIName2, @IPName, @IP)"; 

      SqlConnection c2 = new SqlConnection(c_string); 
      SqlCommand comm2 = new SqlCommand(cmd2, c2); 
      comm2.Parameters.Add(new SqlParameter("@FIName2", SqlDbType.Char, 40)).Value = name2; 
      comm2.Parameters.Add(new SqlParameter("@IPName", SqlDbType.Char, 40)).Value = name3; 
      comm2.Parameters.Add(new SqlParameter("@IP", SqlDbType.Image)).Value = arrImage2; 

      try 
      { 
       c2.Open(); 
       comm2.ExecuteNonQuery(); 
      } 
      catch (System.Data.SqlClient.SqlException err) 
      { 
       MessageBox.Show(err.Message); 
      } 
      finally 
      { 
       c2.Close(); 
      } 

     } 
     DelDir(); 
     this.Hide(); 
     fourthForm.Show(); 
    } 

    private void DelDir() 
    { 
     string[] files = Directory.GetFiles(cwd); 
     string[] dirs = Directory.GetDirectories(cwd); 

     foreach (string file in files) 
     { 
      File.SetAttributes(cwd, FileAttributes.Normal); 
      File.Delete(file); 
     } 

     Directory.Delete(cwd, false); 
    } 

,这是完整的例外

A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll 
System.IO.IOException: The process cannot access the file 'C:\...\Final.jpg' because it is being used by another process. 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.File.Delete(String path) 
at BlueStitch.frmStitch.DelDir() in C:\...\frmStitch.cs:line 953 
at BlueStitch.frmStitch.button1_Click(Object sender, EventArgs e) in C:\...\frmStitch.cs:line 940 
at System.Windows.Forms.Control.OnClick(EventArgs e) 
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
at System.Windows.Forms.Control.WndProc(Message& m) 
at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
at System.Windows.Forms.Button.WndProc(Message& m) 
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
at BlueStitch.Program.Main() in C:\Users\Freddie Rosillo\Documents\Visual Studio 2008\Projects\BlueStitch\BlueStitch\BlueStitch\Program.cs:line 21 

线是File.Delete(file);
我想我试图处理图像文件,但仍然无法正常工作
帮助请

回答

0

我对此并不积极,但我注意到你非常小心地将图像置于第一个部分:

imgTemp.Image = null; 
    imgTemp.Dispose(); 

但是你忘记了做第二部分:

 imgArray2[i].Image = Image.FromFile(imgName[i]); 
     string name2 = textBox1.Text + ".jpg"; 
     string name3 = imgName[i].Substring(imgName[i].LastIndexOf(@"\") + 1,   imgName[i].Length - imgName[i].LastIndexOf(@"\") - 1); 
     MemoryStream mstr2 = new MemoryStream(); 
     imgArray2[i].Image.Save(mstr2, imgArray2[i].Image.RawFormat); 
     byte[] arrImage2 = mstr2.GetBuffer(); 

尝试增加这些以行最后一部分:

//Set insert query 
    imgArray2[i].Image = null; 
    imgArray2[i].Dispose(); 
2

看看这两个行:

imgTemp.Image = null; 
imgTemp.Dispose(); 

你释放refe在处置PictureBox之前先看图像。这意味着当您调用Dispose()方法时,PictureBox不能处理图像。在垃圾收集器调用图像的终结器之前,图像不会被丢弃。

相关问题