프로그램/C#

C#에서, PictureBox 의 이미지를 파일에서 Load 할 때, 파일이 사용중으로 나오는 경우.

(주)CKBcorp., 2016. 10. 31. 18:27
반응형



말 그대로다.
정확한 오류 메시지는 기억 안나서 넘어가고, 상황은 아래와 같다.

1. PictureBox 의 이미지를 동적으로 바꾸는데
2. 바꿀 이미지가 파일인 경우.
3. 게다가 그 파일이 동적으로 생성될 경우
4. 동적 생성을 위해 이미지 파일을 삭제할 때, 
5. "파일이 사용중입니다" 라는 경고와 함께 프로그램이 죽는 경우.

글은 잘 못 썼지만, C# 의 PictureBox 를 사용하는 사람이라면 대충 뭔소린지 알수 있을 거다.

자. 그래서, 이걸 어찌 해결해야 하는가?
결론부터 말하면, PictureBox.Load( 파일명 ) 을 사용하지 말라는 거다. 
물론 내가 해결한 게 아니고, 전능하신 StackOverflow 에 다 있는 내용이다. ( 오랜만이군. )
혹시나 해서 내가 했던 삽질 실패 내용도 적는다.

11. 1차 시도.

PictureBox.Load( 동적생성이미지파일명 ) ;
File.Delete( 동적생성이미지파일명 );


요런 식으로 작업했는데 에러나더라.

12. 2차 시도.

PictureBox.Load( 동적생성이미지파일명 ) ;
... 원래 작업 등등등 ...
// 파일 삭제가 필요할 때 
PictureBox.Load( 파일삭제할때보여주는임시파일명 ) ;
File.Delete( 동적생성이미지파일명 );


요런 식으로, 지우기 전에 Load() 메소드를 다시 불러서, 삭제할 파일을 PictureBox 가 놓아주도록 했다.
이러니까 에러가 대부분 안 나는데, 어쩌다 한 번 오류가 발생하더라. 그걸 못잡겠어서 stackoverflow 를 보니까
아예 Load()를 쓰지 말고



public Bitmap LoadBitmap(string path)
{
    if (File.Exists(path))
    {
        // open file in read only mode
        using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read))
        // get a binary reader for the file stream
        using (BinaryReader reader = new BinaryReader(stream))
        {
            // copy the content of the file into a memory stream
            var memoryStream = new MemoryStream(reader.ReadBytes((int)stream.Length));
            // make a new Bitmap object the owner of the MemoryStream
            return new Bitmap(memoryStream);
        }
    }
    else
    {
        MessageBox.Show("Error Loading File.", "Error!", MessageBoxButtons.OK);
        return null;
    }
}


picturebox1.Image = LoadBitmap("LOCATION");


설명하길, 원래 Load() 메소드는 파일을 잡고 있는다고 한다. 고로 메모리에 bmp 이미지를 생성한 다음 PictureBox 에 할당해야 파일이 PictureBox 에서 자유로워진다는군.

[ "자유" 로 검색하니 수학의 여신님이 나온다. ]



끝.
 


반응형