2012-03-12 196 views
0

我使用Indy 10和TIdAttachment通過Delphi程序生成帶有附件的電子郵件。文件位置/名稱作爲//server/files/attachments/MyAttachment.pdf存儲在數據庫表中。我的文件附加到電子郵件如下:Delphi - TIdAttachment,從附件的文件名中刪除路徑

// Add each attachment in Attachments 
    for Attachment in Attachments do begin 
     // Make sure file name exists before trying to add 
    if FileExists(Attachment) then 
     TIdAttachmentFile.Create(MessageParts, Attachment); 
    end; 

當我發送附件文件被命名爲

'__server_files_attachments_MyAttachment.pdf'的電子郵件。

有沒有辦法刪除文件路徑,使附件在收件人收到郵件時顯示爲'MyAttachment.pdf'?

我嘗試使用ExtractFileName()但沒有運氣。我不認爲它工作的路徑&文件名是作爲一個字符串從數據庫傳來的。

編輯

我也試圖解壓文件名本身如下:

function GetFileName(FullPath: string): string; 
var 
    StrFound: TStringList; 
begin 
    StrFound := TStringList.Create(); 
    ExtractStrings(['/'], [' '], PChar(FullPath), StrFound); 
    result := StrFound[StrFound.Count - 1]; 
end; 

這將返回「MyAttachment.pdf」但這會導致德爾福尋找的文件夾在其中的程序正在爲不在'// server/files/attachments'中的文件運行。看來,除非我可以在調用TIdAttachmentFile.Create()之後重命名附件,否則我無法更改文件名。

編輯 - 解決方案:

顯示使用雷米的意見的解決方案(和使用GetFileName()從上面):

// Add each attachment in Attachments 
for Attachment in Attachments do begin 
    // Make sure file name exists before trying to add 
    if FileExists(Attachment) then begin 
    with TIdAttachmentFile.Create(MessageParts, Attachment) do begin 
     Filename := GetFileName(Attachment); 
    end; 
    end; 
end; 
+0

究竟你傳遞給'ExtractFileName'的是什麼? – 2012-03-12 18:11:09

+0

我叫ExtractFileName(附件); 'attachment'是'//server/files/attachments/MyAttachment.pdf' – BrianKE 2012-03-12 18:25:48

+0

如果您將解決方案發布在Remy接受的答案的底部,那會更好。問題只是針對...問題。隨意編輯別人的帖子,SO是一個分享知識的地方;) – bluish 2013-01-23 16:01:18

回答

2

可能的Windows將'/'識別爲路徑分隔符,但RTL不會。本地路徑和UNC路徑必須使用'\'。在傳遞給Indy之前,您必須將文件名字符串從'/'標準化爲'\',例如UnixPathToDosPath()

+0

我認爲你不必這樣做。應該可以爲附件設置一個單獨的文件名,該文件名甚至不應與原始文件名相同。您的解決方案是解決不存在的問題的解決方法。 – GolezTrol 2012-03-12 23:32:25

+0

在構建附件對象實例後,您可以隨時將「TIdAttachment.FileName」屬性設置爲任何您想要的值。 'TIdAttachment'構造函數使用'ExtractFileName()'來設置一個默認的屬性值,但是如果你不需要它的話,你不會被鎖定到那個值。 – 2012-03-13 01:19:41

+0

將'/'更改爲'\'以獲取文件名時,Delphi現在只會看到'MyAttachment.pdf',並且不會附加文件。然而,我能夠使用TIdAttachment.FileName屬性解決此問題(請參閱原始帖子,解決方案的第二次編輯)。感謝雷米! – BrianKE 2012-03-13 11:59:56

0

到TIdAttachment.Create呼叫中包括自己的ExtractFilename電話,所以你不」無需提前打電話 - 它需要找到你的文件的路徑。

我認爲你在一個catch-22中,你需要發送TidAttachment.Create一個它理解的路徑,因爲它使用了完整的路徑來添加你的文件,然後它只提取文件名給你,只要你想包括在你的信息中。我認爲它不像您想要的那樣工作,因爲它無法正確執行ExtractFilename部分。所以,而不是提取文件名,只需以TIdAttachment.Create可以理解的方式形成路徑。

在這種情況下,我想嘗試映射驅動器,並使用驅動器映射爲:

Z:\文件\附件\ MyAttachment.pdf = //server/files/attachments/MyAttachment.pdf

只需用Z:\和/ with \預處理您的附件替換//服務器,然後嘗試它。

編輯考慮雷米的評論: 交換/字符到\字符

\\服務器\文件\附件\ myattachment.pdf

然後撥打電話到TIdAttachment.Create

+1

Indy可以使用UNC路徑就好了。問題出現在'/'字符中。他們需要是''''而不是。 – 2012-03-12 19:21:53

2

您只能創建TIdAttachmentFile文件,並且只需要附件具有的文件名。構建完成後,將附件的StoredPathName屬性設置爲完整路徑。

var 
    a: TIdAttachmentFile; 
    FileName: string; 

... 

    FileName := ExtractFilePath(AttachmentPath); 
    a := TIdAttachmentFile.Create(MessageParts, FileName); 
    a.StoredPathName := AttachmentPath; 
+1

反過來做。讓構造函數設置'StoredPathName'屬性,然後將'FileName'屬性更新爲您想要的內容。 – 2012-03-13 01:23:34

+0

這可能是對的。我可能誤解了代碼,並且目前無法對其進行測試。感謝您的補充/更正。 – GolezTrol 2012-03-13 15:15:46