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 — Вспомогательная (возвращает размер заданного файла).

    Ссылку на файл 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
                  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 (скачать).


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


    Дата: 19.11.2022