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';
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;
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