2012-03-15 11 views
4

私のデスクトップアプリケーションは、インターネットからファイルをダウンロードする必要があります。ファイルへのパスは既知です。ファイル名自体は準変数です。つまり、他の誰かが新しいファイルをそこに置くことになり、私のアプリケーションはそれらをダウンロードする必要があります。Delphiでファイル名をURLエンコードするにはどうすればよいですか?

ここで、URLが安全で、正しく解釈されるようにしたいと思います。また、ファイル名に "#"がある場合(わからない)、私はそれをエンコードしたいと思います。 Javascriptには、encodeURIencodeURIComponentの2つの異なる機能があります。後者は、とりわけ '#'文字をエンコードします。 もちろん、私は自分自身をロールバックすることができますが、私はそれのための準備ができていることに気づきました。そして、私は古い間違いを避けることもできます。

WinInetシリーズのAPI関数(InternetOpenとそのilk)を使用するオブジェクトでファイルをダウンロードします。

だから私はMSDNで騒ぎ始めました。確かに、UrlCanonicalizeがあります。しかし、UrlEscape,CreateUri(それはDelphi 2010のユニットにはありません)、そして最後にInternetCreateUrlというURLがあり、URL全体を分割する必要があります。 URLの最初の部分をURLエンコードされたファイル名に連結したいと思います。

また、それらはすべて、異なるバージョンのフラグを持っていますが、Windowsのバージョンによって変更された異なるデフォルトがあります。これ以上の違いはわかりません。誰がこの目的に最も適しているかを知っていますか?

+0

名はエンコード%進する必要があります。私はどの機能がそれをしているのか分かりません。 – Deanna

+0

私の質問で言及したすべての機能は、ある時点でそれを行います。どんな文字がどのフラグでエンコードされるか、すべてのUnicode文字が正しくエンコードされるかどうかは、私には非常に不明です。 – Martijn

+0

注意してください。正しくエンコードされたファイル名を受け取ったからといってファイル名であるとは限りません。ファイル名、特に '..'のような相対パスの構成要素を含むファイル名を受け取った場合、予期せぬファイルを誤って上書きする可能性があります。 –

答えて

8

delphiに含まれるIndyライブラリの一部であるTIdURI.PathEncode関数(idURIユニットにあります)を試してください。

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    idURI, 
    SysUtils; 

Var 
    FileName : string; 
    Encoded : string; 
begin 
    try 
    FileName:='File with a Very weird f***name*#%*#%<>[]'; 
    Encoded:=TIdURI.PathEncode(FileName); 
    Writeln(Encoded); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 

これはまた、あなたがTIdURI.URLDecodeTIdURI.URLEncode機能で見てみることができます

File%20with%20a%20Very%20weird%20f%2A%2A%2Aname%2A%23%25%2A%23%25%3C%3E%5B%5D 

を返します。 xxmプロジェクトのために

+0

さらに優れています:PathEncodeとParamsEncodeはそれぞれ特定の文字セットをエンコードしますが、これもUTF8String文字をエンコードします。ありがとう、それは私が探していたものです! – Martijn

+0

ありがとう!これが私がXDを探していたものです – KryNaC

関連する問題