IO异常 - 另一个进程使用的文件

时间:2013-09-10 21:36:23

标签: c# .net ioexception

C#/ .NET 3.5,WindowsForms。

我有这个Windows窗体显示文件中的图像,每当用户保存记录时,执行此代码:

                    string oldLoc = itemsBO.ImageLoc;
                    if (oldLoc != SystemSettings.NoImageLocation)
                    {
                        if (File.Exists(oldLoc))
                        {
                            try { File.Delete(oldLoc); }
                            catch (IOException ex)
                            {
                                MessageBox.Show("1 - "  + ex.GetType().ToString() + "    " + ex.Message);
                            }
                        }
                    }

                    string saveLoc = itemsBO.ImageSearchLoc + ".jpg";
                    if (File.Exists(saveLoc))
                    {
                        try { File.Delete(saveLoc); }
                        catch (IOException ex)
                        {
                            MessageBox.Show("2 - " + ex.GetType().ToString() + "    " + ex.Message);
                        }
                    }

                    try
                    {
                        if (pictureBox2.Image != null)
                            pictureBox2.Image.Save(saveLoc, System.Drawing.Imaging.ImageFormat.Jpeg);
                    }
                    catch (IOException ex)
                    {
                        MessageBox.Show("3 - " + ex.GetType().ToString() + "    " + ex.Message);
                    }

忽略可怜的MessageBox消息,但它在每个Catch语句中都出错。它无法删除“现有”图像,因为它表示它正在被另一个进程使用。无法保存,因为文件存在于同一路径中,因为它没有删除。

这是在尝试添加新图片时设置图像的代码;

            Image clipImage = Clipboard.GetImage();

            if (tabControl2.SelectedTab == tabPage5)
            {
                pictureBox1.Image = clipImage;
                itemsBO.IsDirtyImage = true;
            }
            else if (tabControl2.SelectedTab == tabPage6)
            {
                pictureBox2.Image = clipImage;
                itemsBO.IsDirtyImage2 = true;
            }

然后当表单加载带有图像的现有记录时,这是用于获取/显示它的代码:

            byte[] bits = File.ReadAllBytes(imgfil);
            msImage = new MemoryStream(bits, 0, bits.Length);

            if (tabControl2.SelectedTab == tabPage5)
                pictureBox1.Image = Image.FromStream(msImage);
            else if (tabControl2.SelectedTab == tabPage6)
                pictureBox2.Image = Image.FromStream(msImage);

当然,imgfil是图像的路径。

绝对不知道从哪里开始...

3 个答案:

答案 0 :(得分:0)

  

我有这个Windows窗体,它显示文件中的图像,以及用户保存记录的时间

如果您在保存文件时仍然显示图像,如果我没有弄错,应用程序仍将访问该文件。首先尝试处理文件,可能是将图片框(或用于显示图像的任何图像)图像设置为空,或者在执行操作之前加载空白图片。

答案 1 :(得分:0)

如果它说另一个进程正在使用该文件,那么它必须被另一个进程使用:)

您是否尝试使用Process Explorer监控文件锁定。 一旦确定了文件的内容,请使用Process Explorer关闭该文件句柄,然后尝试运行代码。

这可能会有所帮助 - How to find out what processes have folder or file locked?

答案 2 :(得分:0)

所以我从另一个用户继承了这个应用程序,结果是pictureBoxes将他们的Image设置在另一个代码块中,与原始帖子中的第三个代码块无关。正因为如此,发生了IOException :(