【问题标题】:Convert a URL to a valid win32 filename in Delphi在 Delphi 中将 URL 转换为有效的 win32 文件名
【发布时间】:2011-08-12 15:45:20
【问题描述】:

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

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

【问题讨论】:

  • 如果您使用的是 Delphi XE,您可以使用正则表达式(RegularExpressions 单元,请参阅regular-expressions.info/delphi.html)虽然我不会称这种方法“简单”:)
  • 虽然我有 Delphi XE,但这个项目目前停留在 Delphi 2007
  • @yms,@Alister,您也可以在 Delphi 2007 中使用正则表达式,实际上您可以使用完全相同的 reg-ex 引擎。这并不意味着它就是这样做的方法。仅仅因为 Delphi 有正则表达式,它们不会自动解决每个字符串处理问题!

标签: delphi url filenames encode


【解决方案1】:

尝试对 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 文章。

【讨论】:

    【解决方案2】:

    您还可以使用 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-to-a-valid-win32-filename-in-delphi

    无论如何,我想知道path handling 有多少个函数。也许PathCreateFromUrl 做你想做的事(当然除了扩展添加),我还没有测试过。

    【讨论】:

      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 2011-12-14
      • 2011-11-24
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2011-12-01
      相关资源
      最近更新 更多