作爲Delphi應用程序的一部分,我希望將URL轉換爲文件名。我正在做的是緩存QR碼。 QR碼代表一個URL,我想用代表該URL的文件名來存儲QR碼圖像。例如,http://myurl.com/bla可能會變成http ___ myrul.com_bla.png - 在這裏,我用下劃線替換了任何非字母數字字符(並添加了.png擴展名)。在Delphi中將URL轉換爲有效的win32文件名稱
我想知道是否有一個簡單的/標準的方式做到這一點(最好在Delphi中)或者我應該編碼上面提到的算法。
作爲Delphi應用程序的一部分,我希望將URL轉換爲文件名。我正在做的是緩存QR碼。 QR碼代表一個URL,我想用代表該URL的文件名來存儲QR碼圖像。例如,http://myurl.com/bla可能會變成http ___ myrul.com_bla.png - 在這裏,我用下劃線替換了任何非字母數字字符(並添加了.png擴展名)。在Delphi中將URL轉換爲有效的win32文件名稱
我想知道是否有一個簡單的/標準的方式做到這一點(最好在Delphi中)或者我應該編碼上面提到的算法。
嘗試編碼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
文章。
您還可以使用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做你想做的(除了擴展當然),我還沒有測試過。
如果您使用Delphi XE,您可以使用正則表達式(RegularExpressions單元,請參閱http://www.regular-expressions.info/delphi.html),但我不會稱這種方法爲「簡單」:) – yms 2011-04-25 23:16:22
雖然我有Delphi的XE,這個項目目前停留在Delphi 2007 – Alister 2011-04-25 23:59:40
@yms,@Alister,你也可以在Delphi 2007中使用正則表達式,事實上你可以使用完全相同的reg-ex引擎。這並不意味着這是做到這一點的方法。僅僅因爲Delphi有正則表達式,它們不會自動成爲每個字符串處理問題的解決方案! – 2011-04-26 05:17:09