質問

私のリストビューでは、特定のフォルダーに小さな画像のサムネイルを表示します。次のようにlistViewをセットアップします。

var imageList = new ImageList();
foreach (var fileInfo in dir.GetFiles())
{
    try
    {
        var image = Image.FromFile(fileInfo.FullName);
        imageList.Images.Add(image);
    }
    catch
    {
        Console.WriteLine("error");
    }
}

listView.View = View.LargeIcon;
imageList.ImageSize = new Size(64, 64);
listView.LargeImageList = imageList;

for (int j = 0; j < imageList.Images.Count; j++)
{
    var item = new ListViewItem {ImageIndex = j, Text = "blabla"};
    listView.Items.Add(item);
}

ユーザーは、ListViewの画像を右クリックして削除できます。 ListViewから削除してから、この画像をフォルダーから削除します。これで、ファイルが使用されているというエラーが表示されます。もちろん、これはイメージエリストがファイルを使用しているため、論理的です。

最初に画像をImageListから削除しようとしましたが、ファイルロックを持ち続けています。

誰かが私が間違っていることを教えてもらえますか?

ありがとう!

役に立ちましたか?

解決

このように、ファイルをメモリストリームにロードする必要があります。

var image = Image.FromStream(new MemoryStream(File.ReadAllBytes(fileInfo.FullName)));

これにより、ファイルは1回のみ読み取られ、ロックされたままになりません。

編集

画像をImageListにロードしています。
ImageListは画像のコピーを作成するため、このように、すぐにオリジナルをすぐに処分する必要があります。

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);

他のヒント

ファイルのロックが解除される前に、画像を処分する必要があります。電話してみてください Dispose 画像リストから削除した後の画像オブジェクト。

画像オブジェクトへの参照があり、GCが収集されていない限り、ロックを維持します。電話 Dispose ハンドルを放棄するように強制し、ファイルのロックを解除する必要があります。

また、アプリがいないことを確認する必要があります CopyHandle または、これを行う前に、画像リソースへの2番目の参照を取得します。

使用する GetThumbnailImage そして、画像を処分します:

var image = Image.FromFile(fileN);

Image imgThumb = image.GetThumbnailImage(100, 100, null, new IntPtr());

imageList1.Images.Add(imgThumb);

image.Dispose();

listView1.LargeImageList = imageList1;

これで、ファイルを削除できます。

File.Delete(FileN);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top