繁体   English   中英

System.IO.IOException:进程无法访问该文件

[英]System.IO.IOException: The process cannot access the file

我有一个按钮,将图像保存到数据库和一个删除目录的功能是我保存到数据库之前暂时存储图像。
这是代码

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

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

看看这两行:

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

在释放PictureBox之前,您将释放对图像的引用。 这意味着当您调用Dispose()方法时PictureBox 无法处理图像。 在垃圾收集器调用图像的终结器之前,不会处理图像。

我对此并不乐观,但我注意到你在第一部分处理你的图像非常小心:

    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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM