Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-01-2014
yn4v4s yn4v4s is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 33
Poder: 0
yn4v4s Va por buen camino
Question 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...
Responder Con Cita
  #2  
Antiguo 17-01-2014
elmago00 elmago00 is offline
Miembro
NULL
 
Registrado: ago 2013
Posts: 86
Poder: 11
elmago00 Va por buen camino
Cita:
Empezado por yn4v4s Ver Mensaje
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
Responder Con Cita
  #3  
Antiguo 17-01-2014
yn4v4s yn4v4s is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 33
Poder: 0
yn4v4s Va por buen camino
Exclamation 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
Responder Con Cita
  #4  
Antiguo 18-01-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 20-01-2014
yn4v4s yn4v4s is offline
Miembro
NULL
 
Registrado: may 2012
Posts: 33
Poder: 0
yn4v4s Va por buen camino
Talking 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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como leer un archivo de Texto alojado en un sitio web Bertifox2008 Internet 9 18-04-2009 01:07:56
leer palabras de ficheros de texto alba13 OOP 10 21-10-2007 16:15:15
Como leer un archivo de texto por codigo Shidalis Varios 2 03-09-2005 05:54:34
¿Cómo gestionar una bd de acces, que contiene un campo de texto y otro con una image? Acuarius3000 Conexión con bases de datos 1 17-01-2005 09:45:33
Saber si un Tabla(dataset) esta siendo usado por otro componente cacuna OOP 3 26-05-2004 18:21:43


La franja horaria es GMT +2. Ahora son las 03:16:34.


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