반응형
말 그대로다.
정확한 오류 메시지는 기억 안나서 넘어가고, 상황은 아래와 같다.
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 에서 자유로워진다는군.
끝.
반응형
'프로그램 > C#' 카테고리의 다른 글
vs2015 signtool error : no certificates were found that met all the given criteria (1) | 2018.05.27 |
---|---|
grid 안의 셀에서 keyDown, KeyUp, KeyPress 이벤트 처리. (0) | 2018.01.16 |
C#에서 압축 작업할 때, ZipFile 클래스 / 객체가 없다고 나오는 경우. (0) | 2016.06.12 |
C# 의 combobox 에서, 드롭다운의 선택한 값을 받을수 없을 때. (3) | 2016.04.13 |
ms access 에서 ISNULL() 쿼리함수. (0) | 2016.03.31 |