4

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

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);
}

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

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

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

ありがとう!

4

3 に答える 3

6

次のように、ファイルをMemoryStreamにロードする必要があります。

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

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

編集

画像をImageListに読み込んでいます。
ImageListはその画像のコピーを作成するため、次のように、オリジナルをすぐに破棄する必要があります。

using (var image = Image.FromFile(fileInfo.FullName))
    imageList.Images.Add(image);
于 2010-04-21T19:51:28.507 に答える
1

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

画像オブジェクトへの参照があり、GCがそれを収集していない限り、ロックは保持されます。呼び出すDisposeと、強制的にハンドルを放棄し、ファイルのロックを解除する必要があります。

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

于 2010-04-21T19:49:43.167 に答える
1

画像を使用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);
于 2015-05-15T13:21:24.310 に答える