1

次のステートメントを使用して、ディレクトリからイメージを削除しようとしています

System.IO.File.Delete(Path);

以前に別の関数でこの画像にアクセスしたことがあります

Image image=Image.FromFile(imagePath)
imageList1.Images.Add(image);

ファイルが別のプロセスによってロックされているというエラーが表示されます。これを検索したところ、使用して画像オブジェクトを破棄する必要があることがわかったので、これを試しました

using(Image image=Image.FromFile(imagePath))
    imageList1.Images.Add(image);

しかし、これにより、program.csで、パラメーターが無効であり、プログラムが実行されないというエラーが発生します。そして、時々エラーが発生します シングルスレッドで2番目のメッセージループを開始することは有効な操作ではありません。代わりに Form.ShowDialog を使用してください。

イメージリストをリストビューに追加しています。ファイルを削除する前に、次のコマンドでイメージリストとリストビューの両方のすべての項目をクリアしています。

imageList1.Images.RemoveByKey(imageName);
imageList1.Images.Clear();
listView1.Items.RemoveByKey(imageName);
listView1.Items.Clear();
listView1.SmallImageList = null;

これは、リストビューにデータを入力している私のコードです。

try
        {
            string album = albumListBox.SelectedItem.ToString();
            List<string> imageName=new List<string>();
            XmlDocument doc = new XmlDocument();
            doc.Load(Application.StartupPath + "/image.xml");
            XmlNodeList list = null;
            list = doc.SelectNodes(string.Format("/images/image"));
            listView1.Columns.Clear();
            listView1.Columns.Add("Image List",210,HorizontalAlignment.Left);
            listView1.SmallImageList = imageList1;
            listView1.Items.Clear();
            imageList1.Images.Clear();
            listView1.MultiSelect = false;
            foreach (XmlNode node in list)
            {
                if (node.ChildNodes[2].InnerText == album)
                {
                    string imagePath = Application.StartupPath + "\\images\\" + album + "\\" + node.ChildNodes[0].InnerText;
                    Image image = Image.FromFile(imagePath);
                        imageList1.Images.Add(image);
                    imageName.Add(node.ChildNodes[0].InnerText);
                }
            }
            for (int j = 0; j < this.imageList1.Images.Count; j++)
            {
                listView1.Items.Add(imageName[j],imageName[j],j);
                listView1.View = View.Details;
            }
        }
        catch (Exception e)
        {
            MessageBox.Show("No Images in this Album Please add the Images");
            showImage.Hide();
        }

これは、ファイルを削除したいコードです

var listItem = listView1.SelectedItems[0];
        string album = albumListBox.SelectedItem.ToString();
        string imageName = listItem.Text;
        string imagePath = Application.StartupPath + "\\images\\" + album + "\\" + imageName;
        XmlDocument doc = new XmlDocument();
        doc.Load(Application.StartupPath + "/image.xml");
        XmlNode node = doc.SelectSingleNode(string.Format("//image[./imageName/text()='" + imageName + "' and ./album/text()='" + album + "']"));
        if (node != null)
        {
            //remove image from directory tooV
            doc.DocumentElement.RemoveChild(node);
            doc.Save(Application.StartupPath + "/image.xml");
            imageList1.Images.RemoveByKey(imageName);
            imageList1.Images.Clear();
            listView1.Items.RemoveByKey(imageName);
            listView1.Items.Clear();
            listView1.Items[listView1.SelectedIndices[0]].Remove();
            imageList1.Images.RemoveAt(listView1.SelectedIndices[0]);
            listView1.SmallImageList = null;
            fillImageList();
            System.IO.File.Delete(imagePath);
            MessageBox.Show("Image deleted");
            fillAlbumList();
        }
4

1 に答える 1

0

画像がimagelist1で参照されている限り、画像は破棄されません。適切に廃棄するには、imagelist1も廃棄する必要があります。次に、Imageへのすべての参照のみが閉じられます。

于 2012-10-06T08:08:43.103 に答える