0

画像のサムネイルを ListView コントロールに正常に読み込んでいます。

lsvImageThumbs.Items.Clear();
        imgl_ImageThumbs.Images.Clear();

        string[] files = Directory.GetFiles(@"C:\Documents and Settings\Etc\Desktop\Test");

        for (int indexFiles = 0; indexFiles < files.Length; indexFiles++)
        {
            Image img = Image.FromFile(files[indexFiles]);
            DirectoryInfo dinfo = new DirectoryInfo(files[indexFiles]);
            imgl_ImageThumbs.Images.Add(dinfo.Name, img);
            lsvImageThumbs.Items.Add(files[indexFiles], dinfo.Name, indexFiles);
        }

次に、画像のサムネイルを選択して、ファイルをディレクトリに移動します。

if (dlg.ShowDialog() == DialogResult.OK)
                {
                    foreach (ListViewItem items in lsvImageThumbs.SelectedItems)
                    {
                        //File.Copy(items.Name, dlg.SelectedPath + "\\" + items.Text);
                        File.Move(items.Name, dlg.SelectedPath + "\\" + items.Text);
                        MessageBox.Show(items.Text + " Taken");
                    }
                }

File.Copy は問題なく動作しますが、File.Move では次のエラーが発生します。

The process cannot access the file because it is being used by another process.
4

1 に答える 1

1

MSDN フォーラムでも同じ質問に回答したことに注意してください。

Image.FromFile は、イメージが破棄されるまでファイルをロックするため、エラーが発生します。これを回避するには、ファイルをメモリにコピーし、そのコピーを ImageList で使用します。

例:

ImageList list = new ImageList();

Image diskImage = Image.FromFile("mypic.jpg");
Image memoryImage = new Bitmap(diskImage);

diskImage.Dispose(); // Releases the lock

list.Images.Add(memoryImage);

コードの変更:

lsvImageThumbs.Items.Clear();
imgl_ImageThumbs.Images.Clear();

string[] files = Directory.GetFiles(@"C:\Documents and Settings\Etc\Desktop\Test");

for (int indexFiles = 0; indexFiles < files.Length; indexFiles++) {
    Image img = Image.FromFile(files[indexFiles]);

    // Create a copy of the image in memory
    Image memImg = new Bitmap(img);

    // Dispose of the original and release the file system lock
    img.Dispose();

    DirectoryInfo dinfo = new DirectoryInfo(files[indexFiles]);

    // Updated this line to add memImg
    imgl_ImageThumbs.Images.Add(dinfo.Name, memImg);

    lsvImageThumbs.Items.Add(files[indexFiles], dinfo.Name, indexFiles);
}

File.Move が機能するはずです。
MSDN の Image.FromFile

于 2012-04-12T08:25:06.463 に答える