Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como leer ficheros de texto que estan siendo usados por otro proceso (https://www.clubdelphi.com/foros/showthread.php?t=85009)

yn4v4s 13-01-2014 21:40:20

Como leer ficheros de texto que estan siendo usados por otro proceso
 
Hola amigos del foro, creo que titulo de este hilo ya es mi pregunta en si.
Necesito cargar en un TStringList un fichero de texto que es creado por otro programa y esta en uso por el mismo, cuando lo intento abrir (solo para leerlo) BOOM: El proceso no tiene acceso al archivo porque está siendo usado por otro proceso.

Necesito me ayuden con esto, GRACIAS...

elmago00 17-01-2014 00:26:39

Cita:

Empezado por yn4v4s (Mensaje 471643)
Hola amigos del foro, creo que titulo de este hilo ya es mi pregunta en si.
Necesito cargar en un TStringList un fichero de texto que es creado por otro programa y esta en uso por el mismo, cuando lo intento abrir (solo para leerlo) BOOM: El proceso no tiene acceso al archivo porque está siendo usado por otro proceso.

Necesito me ayuden con esto, GRACIAS...

al cerrar el otro programa, has intentado volver a leerlo? o es un archivo temporal

yn4v4s 17-01-2014 20:54:33

Disculpa!!!
 
el proceso que crea el fichero es un servicio (el MDaemon para ser preciso): son los ficheros de registro (.log). Como entenderas no puedo detener el SERVIDOR DE CORREO para leer eso ficheros. Gracias :confused:

ecfisa 18-01-2014 09:34:07

Hola yn4v4s.

No sé que modo de uso compartido definió la aplicación que mencionas al abrir el archivo, pero podrías probar de este modo:
Código Delphi [-]
...
const
  F_NAME = 'C:\CARPETA\XXXXXX.LOG'; // ruta + nombre_archivo

function FileHasReadAccess(const aName: TFileName): Boolean;
var
  FileHwnd: THandle;
begin
  FileHwnd := CreateFile(PAnsiChar(aName), GENERIC_READ,
    FILE_SHARE_WRITE+FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  Result := GetLastError <> ERROR_SHARING_VIOLATION;
  CloseHandle(FileHwnd);
end;

function ApiReadTxtFile(const aName: TFileName): string;
var
  FileHwnd: THandle;
  dwBytesToRead: DWORD;
  lpBytesRead: Cardinal;
  lpBuffer: PChar;
begin
  FileHwnd := CreateFile(PAnsiChar(aName), GENERIC_READ,
     FILE_SHARE_WRITE+FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  if FileHwnd <> INVALID_HANDLE_VALUE then
  begin
    dwBytesToRead := GetFileSize(FileHwnd, nil);
    lpBuffer := VirtualAlloc(nil, dwBytesToRead, MEM_COMMIT, PAGE_READWRITE);
    try
      SetFilePointer(FileHwnd, 0, nil, FILE_BEGIN);
      ReadFile(FileHwnd, lpBuffer^, dwBytesToRead, lpBytesRead, nil);
      SetString(Result, lpBuffer, dwBytesToRead);
    finally
      VirtualFree(lpBuffer, dwBytesToRead, MEM_RELEASE);
    end;
  end;
  CloseHandle(FileHwnd);
end;

// Llamada ejemplo:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if FileHasReadAccess(F_NAME) then
  begin
    Memo1.Clear;
    Memo1.Text := ApiReadTxtFile(F_NAME);
    Memo1.Invalidate;
  end
  else
   raise Exception.Create('Un proceso usa el archivo y niega compartir la lectura.');
end;
...
De todos modos no sé si es una buena idea... Nada garantiza que estes leyendo información actualizada y mas importante aún, es que escribir y leer un archivo al mismo tiempo con dos procesos diferentes expone los datos a posibles corrupciones.

Saludos :)

yn4v4s 20-01-2014 16:17:48

Eso tiene buena pinta
 
Muchas gracias ecfisa, ahora no tengo tiempo de probar eso, estoy complicado con el work, pero en cuanto pueda lo pruebo y te digo. OK
Realmente no me preocupa mucho eso último que me dices ya que yo solo LEO el fichero cuando el proceso que lo crea lo modifica, cosa que no es constante, para eso estoy monitoriando la Shell en espera de ese evento. ;)

Muchas garcias por tu tiempo.


La franja horaria es GMT +2. Ahora son las 20:19:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi