在Delphi中将URL转换为有效的win32文件名

时间:2011-04-25 22:58:29

标签: delphi url filenames encode

作为Delphi应用程序的一部分,我想将URL转换为文件名。我正在做的是缓存QR码。 QR码代表一个URL,我想用一个代表该URL的文件名存储QR码图像。例如http://myurl.com/bla可能会成为http ___ myrul.com_bla.png - 这里我刚刚用下划线替换了任何非字母数字字符(并添加了.png扩展名)。

我想知道是否有一种简单/标准的方法(最好是在Delphi中)或者我应该编写上面提到的算法。

2 个答案:

答案 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做你想做的事(除了扩展添加当然),我还没有测试过。