2013-06-10 1 views
0

방금 ​​파일을 삭제하려고하면 "프로세스가 다른 프로세스에서 사용 중이기 때문에 파일에 액세스 할 수 없습니다."라는 오류 메시지가 나타납니다. 업로드되었습니다 (파일 업로드 후 최소 몇 초가 지났기 때문에 작성을 마쳤습니다). 이것이 일어나는 이유는 무엇입니까? 추신 : 내가 만든 축소판은 문제없이 삭제되지만 원본은 어떻게 든 잠겨 있습니다. 당신의 MakeThumbnail 방법에서는 포토 툴 클래스 내부 정적 클래스를 사용하는 다른 프로세스에서 사용 중이므로 프로세스가 파일에 액세스 할 수 없습니다.

  var FileExt = Path.GetExtension(photo.File.FileName); 
      var FilePath = Path.Combine(Server.MapPath("~/App_Data/" + photo.ClientId), photo.PhotoId.ToString()) + FileExt; 
      photo.File.SaveAs(FilePath); 
      var ThumbFilePath = Path.Combine(Server.MapPath("~/App_Data/" + photo.ClientId),photo.PhotoId.ToString() + "_thumbnail") + FileExt; 
      PhotoTools.MakeThumbnail(FilePath, ThumbFilePath, 0.15); 
      return RedirectToAction("Create"); 

...

public static void MakeThumbnail(string ImgIn, string ImgOut, double Percent) 
    { 
     Image img = Image.FromFile(ImgIn); 
     double Width = img.Width*Percent; 
     double Height = img.Height*Percent; 
     MakeThumbnail(ImgIn, ImgOut, (int)Width, (int)Height); 
    } 

삭제 기능 ...

public ActionResult DeleteConfirmed(int id) 
    { 
     Client client = db.Clients.Find(id); 
     db.Clients.Remove(client); 
     db.SaveChanges(); 
     if (Directory.Exists(Server.MapPath("~/App_Data/" + id))) 
     { 
      Directory.Delete(Server.MapPath("~/App_Data/") + id,true); 
     } 
     return RedirectToAction("Index"); 
    } 
+0

다른 MakeThumbnail 코드를 표시하십시오. 확실히 당신은 수업을 처분하지 않을거야. – Haney

+0

당신은 "내가 방금 업로드 한 파일을 지우려고 할 때"_ 분명히 설명 할 수 있습니다. 파일이나 미리보기 이미지의 코드에는 '삭제'가 없으므로 Windows 탐색기 나 이와 유사한 도구를 사용하여 이러한 파일을 삭제하는 것에 대해 이야기하는 것 같습니다. 그게 맞습니까? 아니면 ...? –

+0

파일을 생성 한 동일한 요청 중에 파일을 삭제 하시겠습니까? –

답변

4

, 당신은 Image 유형에 대한 Dispose()를 호출하고 있는지 확인하십시오. 그 또는 사용 구문을 사용하십시오 :

using (Image img = Image.FromFile(ImgIn)) 
{ 
    // Your code 
} 
+3

+1 만약 GC에 관리되지 않는 리소스를 로딩하는 것으로부터 파일에 대한 "루트 참조"가 어떻게 작동하는지 설명 할 수 있다면, 파일을 잠그는 것이 좋습니다. –

+0

@JeremyThompson - 설명 할 수 있을지 잘 모르겠습니다. 내가 그것을 upvote 수 있도록 여기에 게시하거나 게시물을 편집 할 수 있습니까? – Haney

관련 문제