Преобразовать URL в действительное имя файла win32 в Delphi - PullRequest
2 голосов
/ 26 апреля 2011

Как часть приложения Delphi я хочу преобразовать URL в имя файла.Я занимаюсь кэшированием QR-кодов.QR-код представляет URL-адрес, и я хочу сохранить изображение QR-кода с именем файла, представляющим этот URL-адрес.Например, http://myurl.com/bla может стать http ___ myrul.com_bla.png - здесь я только что заменил любые не буквенно-цифровые символы подчеркиванием (и добавил расширение .png).

Мне было интересно, есть лиЭто был простой / стандартный способ сделать это (желательно в Delphi) или я должен был написать код, упомянутый выше.

Ответы [ 2 ]

7 голосов
/ 26 апреля 2011

попробуйте кодировать 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('/7747232/preobrazovat-url-v-deistvitelnoe-imya-faila-win32-v-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 голосов
/ 26 апреля 2011

Вы также можете использовать функцию PathGetCharType из Windows API.

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

begin
  s := '/7747232/preobrazovat-url-v-deistvitelnoe-imya-faila-win32-v-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

В любом случае, мне было интересно, сколько функций существует для обработки пути .Может быть, PathCreateFromUrl делать то, что вы хотите (кроме добавления расширений, конечно), я еще не проверял.

...