2012-03-12 195 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