2017-07-18 27 views
1

我正在使用c#。我收到有關其他進程當前訪問的路徑的錯誤。我的系統試圖做的是訪問路徑:@「C:\ temps \」+ client_ids +「_」+ rown +「.pdf」,並在發送給客戶的電子郵件之前使用相同的路徑進行附件。如何使2進程訪問相同的路徑?

這是我到目前爲止所做的。我註釋掉了我的一些代碼,因爲我不知道該怎麼做。

FileStream fs = null; 
using (fs = new FileStream(@"C:\\temps\\" + client_ids + "_" + 
rown + ".pdf", 
FileMode.Open,FileAccess.Read,FileShare.ReadWrite)) 
{ 
    TextReader tr = new StreamReader(fs);     
    //report.ExportToDisk 
    //(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat,tr); 
    //report.Dispose(); 
    //Attachment files = new Attachment(tr); 
    //Mailmsg.Attachments.Add(files); 
    //Clients.Send(Mailmsg); 
} 
+0

什麼類型是'report'變量?它看起來像你試圖將報告導出到一個不太可能工作的「TextReader」。 –

+0

始終使用[Path.Combine](https://msdn.microsoft.com/en-us/library/system.io.path.combine(v = vs.110).aspx)構建路徑。 – FortyTwo

+0

感謝您的建議四十二。 – 19GreenBlankets

回答

4

您在郵​​件的附件使用它之前,然後使用,而不是原來的文件

+0

阿里爵士,你有什麼機會得到你想說的話嗎?我得到你想說的先生,但我不確定我的代碼庫。非常感謝你的回覆。 – 19GreenBlankets

+0

不客氣。 從微軟檢出此鏈接:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-copy-delete-and-move-files-and-folders – Ali

0

您不能將文件附加到電子郵件中,如果該文件是開放的副本,你可以使文件的臨時副本。您必須先關閉(保存)文件。

@ali答案在技術上是正確的,這是沒有必要的。爲什麼要經歷創建文件副本的開銷,然後需要刪除等等?

假設我明白你想要做的是正確的,只需將你的郵件代碼移動到文件被成功創建和保存後即可。而且,我不認爲你需要文件流或文本閱讀器的開銷。只要您的報告對象可以將文件保存到磁盤的某個位置,您可以將該文件附加到您的電子郵件中,然後發送它。

雖然我並不知道的Crystal Decisions如何處理出口,等事情也許類似這樣的工作:

(我得到了這樣的代碼:https://msdn.microsoft.com/en-us/library/ms226036(v=vs.90).aspx

private void ExportToDisk (string fileName) 
{ 
    ExportOptions exportOpts = new ExportOptions(); 
    DiskFileDestinationOptions diskOpts = 
     ExportOptions.CreateDiskFileDestinationOptions(); 

    exportOpts.ExportFormatType = ExportFormatType.RichText; 
    exportOpts.ExportDestinationType = 
     ExportDestinationType.DiskFile; 

    diskOpts.DiskFileName = fileName; 
    exportOpts.ExportDestinationOptions = diskOpts; 

    Report.Export(exportOpts); 
} 

你會需要更改ExportFormatType屬性。

然後,將文件只需連接到您的電子郵件,然後發送:

Attachment Files = new Attachment(filename); 
Mailmsg.Attachments.add(files); 
Clients.Send(Mailmsg);