作为Delphi应用程序的一部分,我想将URL转换为文件名。我正在做的是缓存QR码。 QR码代表一个URL,我想用一个代表该URL的文件名存储QR码图像。例如http://myurl.com/bla可能会成为http ___ myrul.com_bla.png - 这里我刚刚用下划线替换了任何非字母数字字符(并添加了.png扩展名)。
我想知道是否有一种简单/标准的方法(最好是在Delphi中)或者我应该编写上面提到的算法。
答案 0 :(得分: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
文章。
答案 1 :(得分: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的文件名合的Delphi
无论如何,我想知道path handling有多少函数存在。也许PathCreateFromUrl做你想做的事(除了扩展添加当然),我还没有测试过。