Hola gente, hace no mucho que estoy con Delphi y la verdad no me gustan algunas funciones de el, como por ej. para leer ficheros de texto o binarios y escribirlos. Así que decidí codear esas funciones usando las apis ReadFile / WriteFile.

Código: Seleccionar todo

//******************************************************************************
//* UNIT:         UNT_ReadWriteAPI
//* AUTOR:        Fakedo0r
//* CORREO:       [email protected]
//* BLOG:         Sub-Soul.blogspot.com
//* FECHA:        07.04.2012
//* REFERENCIA:   http://msdn.microsoft.com/en-us/library
//*               /windows/desktop/aa363858(v=vs.85).aspx
//*               /windows/desktop/aa365467(v=vs.85).aspx
//*               /windows/desktop/aa365747(v=vs.85).aspx
//* ----------------------------------------------------------------------------
//* FUNCIONES:    ReadFileA
//*               WriteFileA
//*               StringToByteArray
//*               ByteArrayToString
//*               MsgBoxA
//*
//*
//* USO:          sVar := ReadFileA('C:\Origen.exe');
//*               WriteFileA('C:\Destino.exe', sVar);
//******************************************************************************
unit UNT_ReadWriteAPI;
//******************************************************************************
//DECLARACION LIBRERIAS / CLASES
//******************************************************************************
interface

uses
  Winapi.Windows, System.SysUtils, ShlObj;
//******************************************************************************
//DECLARACION DE FUNCIONES / PROCEDIMIENTOS
//******************************************************************************
function MsgBoxA(sMensaje: String): SmallInt;
function ReadFileA(sFile: String): String;
function WriteFileA(sFile: String; const sBuffer: String): Bool;
function StringToByteArray(sCadena: AnsiString): TBytes;
function ByteArrayToString(bByteArray: TBytes): AnsiString;
//******************************************************************************
implementation
//******************************************************************************
//******************************************************************************
//<--- LEE --->
//******************************************************************************
function ReadFileA(sFile: String): String;
var
  dwRet:    DWORD;
  hFile:    THandle;
  iSize:    Integer;
  bRead:    TBytes;
begin
  hFile := CreateFile(PChar(sFile), GENERIC_READ, FILE_SHARE_READ, nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

  if hFile = INVALID_HANDLE_VALUE then
  begin
    MsgBoxA('Se produjo algun error !');
    Exit;
  end;

  iSize := GetFileSize(hFile, nil);
  SetFilePointer(hFile, 0, nil, FILE_BEGIN);
  SetLength(bRead, iSize);

  ReadFile(hFile, bRead[0], iSize, dwRet, nil);
  CloseHandle(hFile);

  Result := ByteArrayToString(bRead);
end;
//******************************************************************************
//<--- ESCRIBE --->
//******************************************************************************
function WriteFileA(sFile: String; const sBuffer: String): Bool;
var
  dwRet:    DWORD;
  hFile:    THandle;
  iSize:    Integer;
  bWrite:   TBytes;
begin
  Result := True;
  bWrite := StringToByteArray(sBuffer);
  iSize := Length(bWrite);
  hFile := CreateFile(PChar(sFile), GENERIC_WRITE, FILE_SHARE_READ, nil,
                      OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

  WriteFile(hFile, bWrite[0], iSize, dwRet, nil);
  CloseHandle(hFile);
end;
//******************************************************************************
//<--- CONVIERTE ARRAY DE BYTES EN STRING --->
//******************************************************************************
function ByteArrayToString(bByteArray: TBytes): AnsiString;
var
  i: Integer;
begin
  SetLength(Result, Length(bByteArray));

  for i := 0 to Length(bByteArray) do
    Result[i + 1] := AnsiChar(bByteArray[i]);
end;
//******************************************************************************
//<--- CONVIERTE STRING EN ARRAY DE BYTES --->
//******************************************************************************
function StringToByteArray(sCadena: AnsiString): TBytes;
var
  i: Integer;
begin
  SetLength(Result, Length(sCadena));

  for i := 0 to Length(sCadena) do
    Result[i - 1] := Byte(sCadena[i]);
end;
//******************************************************************************
//<--- MSGBOX --->
//******************************************************************************
function MsgBoxA(sMensaje: String): SmallInt;
begin
  Result := MessageBoxEx(0, PChar(sMensaje), 'Mensaje', MB_ICONINFORMATION, 0);
end;
end.
Saludos
El secreto de mi éxito es Jesús
Hola. Yo hace años que programo en Delphi y te recomiendo que le pegues una ojeada a los TFileStream [Enlace externo eliminado para invitados].

Cualquier duda avisame.
Saludos.
Si se va a trabajar con binarios creo que es mejor dejar el retorno como un array de bytes, jeje aunque no veo problemas con usar mejor directamente las APIS, te da más facilidad de trabajar sobre el archivo al momento de programar con usando el mismo handle :P, se agradece el aporte y la movilidad que le das a la sección.
//mHmm..
BrunoBsso escribió:Hola. Yo hace años que programo en Delphi y te recomiendo que le pegues una ojeada a los TFileStream [Enlace externo eliminado para invitados].

Cualquier duda avisame.
Saludos.
Ya le he pegado un ojo hace 1 semana y la verdad me gusta mas con las apis , pero gracias por la recomendación y por la ayuda que siempre surgen dudas.
linkgl escribió:Re: ReadWriteAPI [UNIT] [Fakedo0r]
Si se va a trabajar con binarios creo que es mejor dejar el retorno como un array de bytes, jeje aunque no veo problemas con usar mejor directamente las APIS, te da más facilidad de trabajar sobre el archivo al momento de programar con usando el mismo handle :P, se agradece el aporte y la movilidad que le das a la sección.
linkgl, eso lo dejo para el gusto de cada uno colega

Gracias por los comentarios
El secreto de mi éxito es Jesús
Responder

Volver a “Fuentes”