【问题标题】:IO Exception - File In Use By Another ProcessIO 异常 - 另一个进程正在使用文件
【发布时间】:2013-09-14 18:22:51
【问题描述】:

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 当然是图像的路径。

完全不知道从哪里开始......

【问题讨论】:

  • 您是否在代码 itemsBO.ImageLoc 的某个位置读取文件?
  • ImageLoc 是文件的路径,是的。
  • 我的意思是你是在这个位置加载文件 itemsBO.ImageLoc 到你的应用程序中吗?如果是,你是如何加载它的
  • 文件的创建者和代码运行的Account一样吗?换句话说,它可能没有删除文件的权限。建议更改文件的权限并重新运行您的代码。
  • 很多时候,未必还没有创建文件--他们使用Win7中的截图工具截屏,然后右键-->复制,甚至不保存和粘贴它进入应用程序。

标签: c# .net ioexception


【解决方案1】:

我有这个 Windows 窗体,它显示来自文件的图像,并且每当用户保存记录时

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

【讨论】:

  • 尝试将其更改为将图片框的图像放入临时 Image 对象中,然后将图片框设置为空,这样我就可以保存临时而不是图片框,但这会产生相同的结果 :(
  • @user1096207 正在使用 File.ReadAllBytes(imgfil) 方法来加载图像。此方法打开文件,将文件内容读入字节数组,然后关闭文件。所以事实并非如此。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    所以我从另一个用户那里继承了这个应用程序,结果发现图片框的图像设置在另一个代码块中,独立于原始帖子中的第三个代码块。正是因为如此,才会发生 IOException :(

    【讨论】:

      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多