2011-04-25 56 views
2

作爲Delphi應用程序的一部分,我希望將URL轉換爲文件名。我正在做的是緩存QR碼。 QR碼代表一個URL,我想用代表該URL的文件名來存儲QR碼圖像。例如,http://myurl.com/bla可能會變成http ___ myrul.com_bla.png - 在這裏,我用下劃線替換了任何非字母數字字符(並添加了.png擴展名)。在Delphi中將URL轉換爲有效的win32文件名稱

我想知道是否有一個簡單的/標準的方式做到這一點(最好在Delphi中)或者我應該編碼上面提到的算法。

+1

如果您使用Delphi XE,您可以使用正則表達式(RegularExpressions單元,請參閱http://www.regular-expressions.info/delphi.html),但我不會稱這種方法爲「簡單」:) – yms 2011-04-25 23:16:22

+0

雖然我有Delphi的XE,這個項目目前停留在Delphi 2007 – Alister 2011-04-25 23:59:40

+0

@yms,@Alister,你也可以在Delphi 2007中使用正則表達式,事實上你可以使用完全相同的reg-ex引擎。這並不意味着這是做到這一點的方法。僅僅因爲Delphi有正則表達式,它們不會自動成爲每個字符串處理問題的解決方案! – 2011-04-26 05:17:09

回答

7

嘗試編碼URL(返回的字符串將是總是一個有效的文件名),然後添加擴展。該過程也是可逆的,所以你可以從文件名獲得原始URL。

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 

function URLEncode(const AUrl: string): string; 
var 
    Index: Integer; 
begin 
    Result := ''; 
    for Index := 1 to Length(AUrl) do 
    begin 
    case AUrl[Index] of 
     'A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.': Result := Result + AUrl[Index]; 
     ' '          : Result := Result + '%20'; 
    else 
     Result := Result + '%' + IntToHex(Ord(AUrl[Index]), 2); 
    end; 
    end; 
end; 

function UrlToFileName(const AUrl,Ext : string) : TFileName; 
begin 
    Result := Format('%s.%s',[URLEncode(AUrl),Ext]); 
end; 

begin 
    try 
    Writeln(UrlToFileName('http://stackoverflow.com/questions/5784218/convert-a-url-to-a-valid-win32-filename-in-delphi','png')); 
    except 
    on E:Exception do 
     Writeln(E.Classname, ': ', E.Message); 
    end; 
    Readln; 
end. 

這將返回

http%3A%2F%2Fstackoverflow.com%2Fquestions%2F5784218%2Fconvert-a-url-to-a-valid- 
win32-filename-in-delphi.png 

,瞭解更多信息閱讀Naming Files, Paths, and Namespaces文章。

4

您還可以使用Windows API的PathGetCharType函數。

uses ShLwApi; 
... 
var s: string; 
    i: integer; 

begin 
    s := 'http://stackoverflow.com/questions/5784218/convert-a-url-to-a-valid-win32-filename-in-delphi'; 

    for i := 1 to Length(s) do 
    if PathGetCharType(s[i]) in [GCT_INVALID, GCT_SEPARATOR] then 
     s[i] := '_'; 

    Writeln(s); 
end; 

這將返回 HTTP ___ stackoverflow.com_questions_5784218_convert-A-URL到一個有效-Win32的文件名,在德爾福

反正,我不知道很多功能如何存在path handling。也許PathCreateFromUrl做你想做的(除了擴展當然),我還沒有測試過。