DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

表示中の画像ファイルが削除できない問題の解決法

画像ファイルを読み込み、Imageオブジェクトを作成する」で紹介しているような方法で画像ファイルからImageオブジェクトを作成した時、Imageオブジェクトが破棄されるまで画像ファイルがロックされます。

例えば以下のように、Image.FromFileメソッドでImageオブジェクトを作成して、PictureBox.Imageプロパティで画像を表示した場合、少なくとも画像を表示している間は、その画像ファイルの削除、名前変更、上書きなどができなくなります。

VB.NET
コードを隠すコードを選択
'PictureBox1に"C:\test.bmp"を表示する。"C:\test.bmp"が削除できなくなる。
PictureBox1.Image = System.Drawing.Image.FromFile("C:\test.bmp")
C#
コードを隠すコードを選択
//PictureBox1に"C:\test.bmp"を表示する。"C:\test.bmp"が削除できなくなる。
PictureBox1.Image = System.Drawing.Image.FromFile(@"C:\test.bmp");

この問題の回避法は、「マイクロソフト サポート技術情報 - 309482」にある通り、FileStreamオブジェクトを使用することです。

以下に、ファイルをロックすることなくImageオブジェクトを作成するメソッドの例を示します。

VB.NET
コードを隠すコードを選択
''' <summary>
''' 指定したファイルをロックせずに、System.Drawing.Imageを作成する。
''' </summary>
''' <param name="filename">作成元のファイルのパス</param>
''' <returns>作成したSystem.Drawing.Image。</returns>
Public Shared Function CreateImage(ByVal filename As String) _
        As System.Drawing.Image
    Dim fs As New System.IO.FileStream( _
        filename, _
        System.IO.FileMode.Open, _
        System.IO.FileAccess.Read)
    Dim img As System.Drawing.Image = System.Drawing.Image.FromStream(fs)
    fs.Close()
    Return img
End Function
C#
コードを隠すコードを選択
/// <summary>
/// 指定したファイルをロックせずに、System.Drawing.Imageを作成する。
/// </summary>
/// <param name="filename">作成元のファイルのパス</param>
/// <returns>作成したSystem.Drawing.Image。</returns>
public static System.Drawing.Image CreateImage(string filename)
{
    System.IO.FileStream fs = new System.IO.FileStream(
        filename,
        System.IO.FileMode.Open,
        System.IO.FileAccess.Read);
    System.Drawing.Image img = System.Drawing.Image.FromStream(fs);
    fs.Close();
    return img;
}
  • 履歴:
  • 2012/7/27 具体例をメソッドにした。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。