2013-10-14 5 views
2

asp.net 3.5 및 C#을 사용하여 SharePoint 2010에서 사용자 지정 타이머 작업 서비스를 만들고 있습니다.이 서비스에서 비즈니스 논리는 각 client.for에 대한 Excel 보고서로 응용 프로그램의 목록을 포함하는 zip 파일을 만들려면 zip 파일을 생성하고 zip 파일을 저장하고 경로가있는 하드 디스크에 저장하는 Ionic.zip 써드 파티 dll과 ZipFile 클래스를 사용하고 있습니다. 내 코드는 두 개의 foreach 루프를 포함하며 클라이언트의 목록과 클라이언트의 목록을위한 upper를 포함합니다. 클라이언트에는 no가있을 수 있습니다. 이러한 응용 프로그램을 zip 파일에 추가하여 하드 디스크에 저장하고이 파일을 메일에 첨부하여 클라이언트에 전송하지만 문제는 다음 클라이언트로 가기 전에 zip 파일을 삭제하려고한다는 것입니다. 하드 디스크에 어떤 파일이 아니지만 "다른 프로세스에서 사용하고 있기 때문에 프로세스가 파일에 액세스 할 수 없습니다."오류가 발생합니다. 또한 첨부 파일로 Excel 보고서의 출력 스트림을 첨부하려고했지만 제로 첨부 파일의 바이트. 이 오류를 어떻게 극복해야합니까? 내가프로세스가 SharePoint 2010 C# 코드의 다른 프로세스에서 사용 중이므로 프로세스가 파일에 액세스 할 수 없습니다.

foreach(list of clients)////may have no. of clients 
{ 
    string zipFileDownloadPath = String.Empty; 
    foreach(list of applications)//may have no. of applications 
    { 
    HttpWebResponse resp = (HttpWebResponse)httpReq.GetResponse(); 
    Stream excelReport = resp.GetResponseStream(); 
    zipFile.AddEntry(appName, excelReport); 
    } 
    zipFileDownloadPath = clientFolder + @"\" + client["client_name"] + "_" + reportDate + ".zip"; 
    zipFile.Save(zipFileDownloadPath); 
    mail.Attachments.Add(new Attachment(zipFileDownloadPath)); 
    smtp.Send(mail);//mail have body, subject etc. 
    //here I am deleting files 
    if (Directory.Exists(clientFolder)) 
    { 
    Directory.Delete(clientFolder, true);//here I am getting error 
    } 
} 

아래의 간단한 코드를 부여하고 나는 나는 또한이 하드 디스크에 파일을 저장하기위한 어떤 요구를하고 메일 첨부 파일이 스트림을 첨부하지 말아야 있도록 출력 스트림에 ZipFile를 저장할 수 있도록 시도 위의 코드, 하지만 문제는, 출력 스트림에 적절한 바이트를 가져 오는 중이지만 메일을 보낼 때 첨부 파일이 0이됩니다.

outputStream .Seek(0, SeekOrigin.Begin); 

또한 파일을 삭제하기 전에 확인 : 여기

foreach(list of clients)////may have no. of clients 
{ 

    foreach(list of applications)//may have no. of applications 
    { 
    HttpWebResponse resp = (HttpWebResponse)httpReq.GetResponse(); 
    Stream excelReport = resp.GetResponseStream(); 
    zipFile.AddEntry(appName, excelReport); 
    } 
    Stream outputStream = new MemoryStream(); 
    zipFile.Save(outputStream); 
    mail.Attachments.Add(new Attachment(outputStream,"ZipFileName" MediaTypeNames.Application.Zip);)); 
    smtp.Send(mail);//mail have body, subject etc. 
} 
+0

실제로 전체 폴더가 아닌 파일을 삭제해야합니다. 2 명이 일하면 두 개의 파일이 생성됩니다. 이 경우 폴더를 삭제할 수 없습니다. –

+0

파일을 삭제하려고했지만 여전히 동일한 오류가 발생합니다 –

+0

친절하게이 문제를 해결하는 방법을 제안 해주세요. –

답변

1

가이 첨부 파일로 전송하기 전에 begiining있어하려면 스트림의 위치를 ​​이동하려고 메일로 출력 스트림을 부착 코드입니다 //

zipFile.Dispose() 

대신 또는 using 문으로 번갈아 (더 잘) 감쌀 수 있습니다.

또한 스트림을 사용하고 있다면 뭔가를 놓치지 않는 한 왜 파일을 하드 드라이브에 저장해야합니까? 그냥 라인을 따라 뭔가를 사용하십시오 :

var ms = new new MemoryStream(); 
zipFile.Save(ms); 
ms.Seek(0, SeekOrigin.Begin); 
mail.Attachments.Add(new Attachment(ms,"ZipFileName" MediaTypeNames.Application.Zip)); 
zipFile.Dispose() 
+0

고마워 루이스. 내 문제를 해결했습니다. 유일한 문제는 첨부하기 전에 출력 스트림의 시작 위치를 찾는 것이 아니라는 것입니다. 그래서 지금 제안한대로 제 코드를 수정했고 정확한 결과를 얻었습니다. 다시 한 번 고맙습니다. –

0

Luis.Luis에게 특별한 감사는 내 문제를 해결했습니다.

안녕하십니까. 마지막으로 내 문제를 해결했습니다. 문제는 내가 출력 스트림에 zip 파일을 저장하여 스트림이 정확한 바이트를 읽고 마지막 위치에 도달하고 첨부 파일에 동일한 스트림을 첨부하는 것이므로 mail 첨부 파일에서 0 바이트를 얻는 이유입니다. Zip 파일에 저장하고 메일에 첨부하기 전에 출력 스트림의 위치를 ​​시작합니다. 참조를 위해 다음 코드를 참조하십시오.

Stream outputStream = new MemoryStream(); 
zipFile.Save(outputStream); 
outputStream .Seek(0, SeekOrigin.Begin); 
mail.Attachments.Add(new Attachment(outputStream,"ZipFileName" MediaTypeNames.Application.Zip);)); 
관련 문제