2016-09-01 2 views
2

그게이 간단한 프로그램입니다. 버튼은 프로그램이에 watersign을두고 그것을 덮어 이미지 파일을 열고있다 :BMP 파일을 덮어 쓰거나 삭제할 수 없습니다. 다른 프로세스에서 사용하고 있기 때문에 삭제할 수 없습니다. - 사용하지 않고 폐기하십시오.

private void button1_Click(object sender, EventArgs e) 
    { 
     var openDialog = new OpenFileDialog(); 
     var dialogResult = openDialog.ShowDialog(); 

     if (dialogResult == DialogResult.OK) 
     { 
      var file = openDialog.FileName; 

      using (var bmp = new Bitmap((Bitmap)Image.FromFile(file))) 
      using (var g = Graphics.FromImage(bmp)) 
      { 
       openDialog.Dispose(); 

       var waterSign = (Bitmap)Properties.Resources.ResourceManager.GetObject("watersign"); 

       var margin = 15; 
       var x = bmp.Width - waterSign.Width - margin; 
       var y = bmp.Height - waterSign.Height - margin; 

       g.DrawImage(waterSign, new Point(x, y)); 

       waterSign.Dispose(); 
      } 

      try 
      { 
       File.Delete(file); 
       //bmp2.Save("C:\\Temp\\huhu.bmp"); 
       this.Dispose(); 
      } 

      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 

를 지금 난 그냥 어떤 이유로 작동하지 않는 저주받은 파일을 삭제하기 위해 노력하고있어. 내가 볼 수있는 것처럼 Dispose()뿐만 아니라 첫 번째 데이터를 가져 오는 또 다른 BMP를 만드는 데 사용했다.

아이디어가 있으십니까? 미리 감사드립니다!

답변

1

라인

using (var bmp = new Bitmap((Bitmap)Image.FromFile(file))) 

로드 파일로부터 비트 맵 다음 Bitmap(Image) 생성자를 사용하는 independent copy를 생성한다. using 문을 종료하면 복사본이 삭제되지만 파일에서 내부 비트 맵은로드되지 않습니다. 그 내부 비트 맵이 결국 GC에 의해 확정 될 때까지 docs에 명시된대로이 파일에 대한 잠금을 유지 : 이미지가 배치 될 때까지

파일이 잠겨 남아있다.

이렇게하면 파일을 즉시 삭제할 수 없습니다. 다음을 만들 중간 MemoryStream로 파일을로드, 또는

Bitmap bmp = null; 
try 
{ 
    using (var bmpFromFile = (Bitmap)Image.FromFile(file)) 
    { 
     bmp = new Bitmap(bmpFromFile); 
    } 

    using (var g = Graphics.FromImage(bmp)) 
    { 
     // Make changes to bmp. 
    } 

    // Save bmp to a temp file. 

    // Delete the original file and move the temp file to that name. 
} 
finally 
{ 
    // Dispose bmp 
    using (bmp) { } 
} 

:

실제로, 당신이 뭔가를 할 수있는 파일의 이미지를 수정하고 원래 위치로 다시 저장하려고 가정 비트 맵은 메모리 스트림에서 here으로 제안됩니다.

+0

매력처럼 작동합니다. 감사합니다. – momo