2012-03-12 47 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()を使用しようとしましたが、運はありませんでした。パス&が1つの文字列としてデータベースから来ているので、私はそれが動作するとは思わない。

EDIT

私も次のようにファイル名自体を抽出しようとした:この戻り「MyAttachment.pdf」

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

が、これは上のプログラムフォルダ内に探しデルファイになり'// server/files/attachments'にないファイルに対して実行されています。 TIdAttachmentFile.Create()を呼び出した後に添付ファイルの名前を変更できない限り、ファイル名を変更することはできません。

EDIT - SOLUTION

レミーのコメントを使用してソリューションを表示(上から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」には何を渡しましたか? –

+0

私はExtractFileName(添付ファイル)を呼び出しました。ここで「添付ファイル」は「//server/files/attachments/MyAttachment.pdf」 – BrianKE

+0

Remyの答えの一番下に解決策を投稿する方が良いでしょう。質問はちょうど...質問です。他の誰かの投稿を自由に編集することができます。したがって、知識を共有する場所です;) – bluish

答えて

2

Windowsのかもしれに電話をかけます'/'をパス区切り文字として認識しますが、RTLは認識しません。ローカルパスとUNCパスの両方で代わりに'\'を使用する必要があります。ファイル名の文字列をなどのようにIndyに渡す前に、ファイル名の文字列を'/'から'\'に正規化する必要があります。

+0

私はあなたがこれを行う必要はないと思う。添付ファイル用に別々のファイル名を設定するだけで、元のファイル名と同じであってはいけません。あなたのソリューションは存在しない問題の回避策です。 – GolezTrol

+0

添付ファイルオブジェクトのインスタンスを作成した後に、いつでも、TIdAttachment.FileName'プロパティを任意に設定することができます。 'TIdAttachment'コンストラクタは' ExtractFileName() 'を使ってデフォルトのプロパティ値を設定しますが、あなたが望んでいなければその値にロックインされません。 –

+0

'/'を '\'に変更してファイル名を取得すると、Delphiは 'MyAttachment.pdf'しか表示せず、ファイルを添付しません。私はTIdAttachment.FileNameプロパティを使ってこれを解決することができました(元の投稿、ソリューションの2番目の編集を参照)。ありがとうレミー! – BrianKE

0

あなたが「ドンようTIdAttachment.Createへの呼び出しは、独自のExtractFilenameコールが含まれてそれを事前に呼び出す必要があります。ファイルを見つけるためにはそのパスが必要です。

キャッチ22に入っていると思いますが、TidAttachmentを送信する必要があります。パスを使用してファイルを追加した後、必要なファイル名だけを抽出するため、理解できるパスを作成します。あなたのメッセージに含める。私はExtractFilename部分を適切に実行できないので、あなたが望むように動作しているとは思わない。したがって、ファイル名を抽出するのではなく、TIdAttachment.Createが理解できる方法でパスを作成するだけです。

この場合、私はドライブをマッピングしようと思い、としてドライブマッピングを使用します。

Z:\のファイルが添付ファイルを\ \ MyAttachment.pdf = //server/files/attachments/MyAttachment.pdf

//サーバーをZ:\および/ with \に置き換えて、添付ファイルを前処理してみてください。

編集はレミーさんのコメントを検討します スワップ/文字が文字

を\に

\\サーバー\ファイル\添付\ myattachment.pdf

が続いTIdAttachment.Create

+1

IndyはUNCパスをうまく使用できます。問題は ''/''文字にあります。代わりに ''\''にする必要があります。 –

2

TIdAttachmentFileは、添付ファイルに付けるファイル名のみで作成できます。構築後、添付ファイルのStoredPathNameプロパティをフルパスに設定します。

var 
    a: TIdAttachmentFile; 
    FileName: string; 

... 

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

他の方法でやります。コンストラクタに 'StoredPathName'プロパティを設定させてから、' FileName'プロパティをあなたが言うべきものに更新します。 –

+0

それは本当かもしれません。私はコードを誤解した可能性があり、現時点でそれをテストすることはできませんでした。追加/修正をありがとう。 – GolezTrol