2017-12-29 64 views
0

db에서 세부 정보를 가져 와서 FileHelper를 사용하여 파일에 저장하고 파일을 전자 메일의 일부로 첨부하고 메일을 보낸 후 파일을 삭제하려고합니다.FileHelper 어셈블리로 만든 파일을 삭제할 수 없습니다.

var engine = new FileHelperEngine<DataModel>(); 

engine.WriteFile(filePath, data); 

//After Mail is sent, deleting the file. 
if (File.Exists(filePath)) 
{       
    File.Delete(filePath); //Error is thrown here 
} 

예외 : 다른 프로세스에서 사용 중이기 때문에 프로세스가 파일 '..//somefilepath' 에 액세스 할 수 없습니다.

메일을 보내 자마자 파일을 삭제해야 서버에있는 사용자가 서버에서 공간을 차지하게됩니다.

다른 프로세스에서이 파일을 삭제하는 방법은 무엇입니까?

편집 : 답장을 보내 주셔서 감사합니다. 파일을 보관하고 파일을 삭제하지 못하게하는 Attachment 인스턴스로 인해 문제가 발생했습니다.

MailMessage mailobj= new MailMessage(); 
Attachment data = new Attachment(filePath); 
mailobj.Attachments.Add(data); 

//after sending mail, i disposed the data 
data.Dispose(); 
+2

사용중인 파일을 삭제할 수 없습니다. Windows에서 허용하지 않습니다. 새로운 시도를하기 전에 약간의 시간을두고 여러 번 시도해 보시기 바랍니다. – Bart

+3

_ 메일을 보낸 후 _ 붉은 깃발이 들립니다. 그 파일을 주장으로 추가 했습니까? 그 메일을 보낸 절차에서 _using 문을 사용하고 있습니까? 메일을 보내는 코드를 보여주십시오. – Steve

+0

제대로 처리했는지 확인하십시오. 나는 당신의 코드가 모든 일회용 객체를 처분하지 않는다고 생각합니다. '데이터'는 이미 컬렉션에 추가하고 메일을 보내도록 서버 개체에 요청하면 첨부 파일이 아닌 해당 파일이 열립니다. – netniV

답변

1

문제의 코드에서 문제가 발생하지 않습니다. WriteFile() 함수는 자동으로 파일을 열고 쓰고 닫음으로써 파일이 계속 사용되지 않습니다. 메일 클라이언트는 파일을 삭제하려고 할 때 여전히 파일을 사용하고있는 범인입니다. 삭제를 시도하기 전에 파일이 완료되고 릴리스되는지 확인하십시오. 도움이 필요하면 질문을 편집하고 메일을 보낼 코드를 추가하십시오.

참고 : 일부 메일 클라이언트는 파일을 성공적으로 보낸 후 자동으로 파일을 삭제할 수 있습니다. 메일 클라이언트에 해당 기능이 있고 활성화되어 있는지 확인하여 직접 파일을 삭제할 필요가 없습니다.

또한 일부 메일 클라이언트는 메모리 스트림을 허용합니다. 메일 클라이언트가 메모리 스트림을 허용하는 경우 데이터를 MemoryStream에 저장하고 파일 대신 메일 클라이언트로 전달하는 것을 고려할 수 있습니다. 이렇게하면 파일을 만들고 삭제하는 것에 대해 걱정할 필요가 없습니다.

+0

당신이 옳았습니다. 그것은 FileHelper의 WriteLine()이 아니 었습니다. 파일을 보유하고 있던 메일을 보내는 과정에서 첨부 인스턴스가있었습니다. –

+1

다른 사람이 주석을 파고 들지 않고도 알 수 있도록 이것을 답으로 표시해야합니다. – netniV

2

파일에 액세스하거나 링크하는 다른 프로세스 (예 : 로컬 전자 메일 클라이언트)가있는 경우 File.Delete 전에이 프로세스를 닫아야합니다. 파일을 직접 사용하는 대신 MemoryStream을 메모리에 복사하여 처분 할 수있는 메모리에 파일을 복사 한 다음 다른 프로세스에서 파일을 사용하지 않도록 File.Delete를 수행 할 수도 있습니다.