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 を設定するコードです。

            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 に答える