Delphi. Файлы. Base64

На предыдущую страницу…


Base64 — стандарт кодирования двоичных данных при помощи только 64 символов ASCII. Алфавит кодирования содержит латинские символы A-Z, a-z, цифры 0-9 (всего 62 знака) и 2 дополнительных символа, зависящих от системы реализации. Каждые 3 исходных байта кодируются 4-мя символами (увеличение на ¹⁄₃).

Среда: Delphi 10.2 Tokyo

  • File_As_StrBase64 — Конвертировать двоичный файл в строку Base64.
  • StrBase64_As_File — Создать двоичный файл из строки Base64.
  • File_LoadFrom_Base64 — Создать двоичный файл из файла в формате Base64.
  • File_SaveTo_Base64 — Создать файл формата Base64 из двоичного файла.
  • FileSize_Int64 — Вспомогательная (возвращает размер заданного файла).

См., также, текст всех функций (html-формат).

03.12.2022 — Есть некоторые исправления (см. здесь) по принципу «война план покажет»…

Ссылку на файл ZIP-архива с примером — см. в конце этого документа.


Uses
  ...
  System.Classes,
  System.NetEncoding,
  System.SysUtils;

function File_As_StrBase64(fnIN:string): string;
//Конвертировать двоичный файл в строку Base64
//fnIN - полное имя бинарного файла
//Возвращаемое значение - строка Base64
Var
  FileStream: TFileStream;
  Output: TStringStream;
  Encoding: TBase64Encoding;
begin
  Result:='';
  fnIN:=trim(fnIN);
  if FileExists(fnIN) then begin
     FileStream := TFileStream.Create(fnIn, fmShareDenyNone {fmCreate});
     try
       FileStream.Seek(0,soFromBeginning);
       Output:= TStringStream.Create('', TEncoding.ASCII);
       TRY
         Encoding:= TBase64Encoding.Create(0);
         TRY
           Encoding.Encode(FileStream, Output);
           Result:= Output.DataString;
         FINALLY
           Encoding.Free;
         END;
       FINALLY
         Output.Free;
       END;
     finally
       FileStream.Free;
     end;
  end;
end;

Uses
  ...
  System.Classes,
  System.NetEncoding,
  System.SysUtils;

function StrBase64_As_File(fnOUT:string; S:String; YesRewrite:boolean=false): boolean;
//Создать двоичный файл из строки Base64
//fnOUT - имя результирующего (создаваемого), двоичного файла
//S - строка Base64
//YesRewrite - флаг. Если =TRUE, то файл с именем fnOUT перезапишется (если уже существует). В противном случае новый файл создан НЕ будет.
//Возвращаемое значение: результат операции ( =TRUE - успешно).
Var
  Yes:boolean;
  Input: TStringStream;
  FileStream: TFileStream;
  Encoding: TBase64Encoding;
begin
  Result:=false;
  Yes:=false;
  if S<>'' then begin
     fnOUT:=trim(fnOUT);
     if fnOUT<>'' then begin
        Yes:=true;
        if not YesRewrite then begin
           if FileExists(fnOUT) then Yes:=false;
        end
        else begin
           System.SysUtils.DeleteFile(fnOUT);
        end;
     end;
  end;
  if Yes then begin
     Input:= TStringStream.Create(S, TEncoding.ASCII);
     TRY
       FileStream := TFileStream.Create(fnOut, fmCreate);
       TRY
         Input.Position:=0;
         Encoding:= TBase64Encoding.Create(0);
         TRY
           Encoding.Decode(Input, FileStream);
           FileStream.Position:=0;
           //if FileSize_Int64(fnOUT)>0 then begin //не факт (03.12.2022)
              Result:=true;
           //end;
         FINALLY
           Encoding.Free;
         END;
       FINALLY
         FileStream.Free;
       END;
     FINALLY
       Input.Free;
     END;
  end;
end;

Uses
  ...
  System.Classes,
  System.NetEncoding,
  System.SysUtils;

function File_LoadFrom_Base64(fnIn64:string; fnOut:string; YesRewrite:boolean=false): boolean;
//Создать двоичный файл из файла в формате Base64

//fnIn64 - имя исходного файла в формате Base64.
//fnOut - имя создаваемого двоичного файла.
//YesRewrite - флаг. Если =TRUE, то файл с именем fnOUT перезапишется (если уже существует). В противном случае новый файл создан НЕ будет.
//Возвращаемое значение: результат операции ( =TRUE - успешно).
Var
  Yes:boolean;
  List64:TStrings;
  s64:string;
begin
  Result:=false;
  Result:=false;
  Yes:=false;
  fnIn64:=trim(fnIn64);
  if FileExists(fnIn64) then begin
     fnOut:=trim(fnOut);
     if fnOut<>'' then begin
        Yes:=true;
        if not YesRewrite then begin
           if FileExists(fnOut) then Yes:=false;
        end
        else begin
           System.SysUtils.DeleteFile(fnOut);
        end;
     end;
  end;
  if Yes then begin
     List64:=TStringList.Create;
     TRY
       List64.LoadFromFile(fnIn64);
       S64:=List64.Text;
       if S64<>'' then begin
          Result:=StrBase64_As_File(fnOut, s64);
       end;
     FINALLY
       FreeAndNil(List64);
     END;
  end;
end;

Uses
  ...
  System.Classes,
  System.NetEncoding,
  System.SysUtils;

function File_SaveTo_Base64(fnIN:string; fnOut64:string; YesRewrite:boolean=false): boolean;
//Создать файл формата Base64 из двоичного файла
//fnIN - имя исходного, двоичного файла
//fnOut64 - имя создаваемого файла Base64
//YesRewrite - флаг. Если =TRUE, то файл с именем fnOut64 перезапишется (если уже существует). В противном случае новый файл создан НЕ будет.
//Возвращаемое значение: результат операции ( =TRUE - успешно).
Var
  Yes:boolean;
  List64:TStrings;
  s64:string;
begin
  Result:=false;
  Yes:=false;
  fnIN:=trim(fnIN);
  if FileExists(fnIn) then begin
     fnOut64:=trim(fnOut64);
     if fnOut64<>'' then begin
        Yes:=true;
        if not YesRewrite then begin
           if FileExists(fnOut64) then Yes:=false;
        end
        else begin
           System.SysUtils.DeleteFile(fnOut64);
        end;
     end;
  end;
  if Yes then begin
     s64:=File_As_StrBase64(fnIN);
     if S64<>'' then begin
        List64:=TStringList.Create;
        TRY
          List64.Text:=S64;
          List64.SaveToFile(fnOut64);
          Result:=true;
        FINALLY
          FreeAndNil(List64);
        END;
     end;
  end;
end;

Uses
  ...
  System.SysUtils;

function FileSize_Int64(fn : string) : int64;
//Вспомогательная (возвращает размер заданного файла с именем fn)
Var
  SearchRec: TSearchRec;
begin
  Result:=-1;
  fn:=(fn);
  if length(fn)>0 then begin
     if FileExists(fn) then begin
        if System.SysUtils.FindFirst(fn, faAnyFile, SearchRec) = 0 then begin
           Result:=SearchRec.Size;
        end;
        System.SysUtils.FindClose(SearchRec);
     end;
  end;
end;

Иллюстрирующий пример (исходники, проект в среде Delphi 10.2 Tokyo).
Имя файла ZIP-архива: base64.zip (скачать).

См., также, текст всех функций (html-формат).

03.12.2022 — в исходниках (см. файл-архив выше) есть некоторые исправления (в соответствии с StrBase64_As_File).


На предыдущую страницу…


Дата: 22.02.2024