0

C#/.NET 3.5,Windows 窗体。

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

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

4

3 回答 3

0

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

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

这可能会有所帮助 -如何找出哪些进程已锁定文件夹或文件?

于 2013-09-11T16:15:27.683 回答
0

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

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

于 2013-09-11T01:03:13.217 回答
0

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

于 2013-09-12T16:48:12.807 回答