Ajuda - Busca - Membros - Calendário
Versão Completa: (Resolvido) Arquivo em uso ou modo exclusivo
Fórum Script Brasil > Programação & Desenvolvimento > Delphi, Kylix
--Vinícius --
Alguém sabe como faço para abrir um arquivo em modo exclusivo pelo delphi?

E também para verificar pelo delphi se algum arquivo da minha máquina está sendo utilizado por alguém de outra máquina?

Obrigado!
Micheus
QUOTE(--Vinícius -- @ 04/03/2008 - 11:50) *
Alguém sabe como faço para abrir um arquivo em modo exclusivo pelo delphi?

se você fizer uso da função da API - OpenFile, basta usar OF_SHARE_EXCLUSIVE no parâmetro uStyle.

Sintax - veja em Help->Windows SDK para mais detalhes:
CODE
HFILE OpenFile(
    LPCSTR lpFileName,    // pointer to filename
    LPOFSTRUCT lpReOpenBuff,    // pointer to buffer for file information  
    UINT uStyle    // action and attributes
   );


Se fizer uso de TFileStream, então use fmShareExclusive como parâmetro na instanciação da classe (chamada ao método Create).

QUOTE
E também para verificar pelo delphi se algum arquivo da minha máquina está sendo utilizado por alguém de outra máquina?
Veja se o que está a partir deste post serve para isto.

Mais detalhes sobre NetFileEnum (ref. msdn)

Abraços
___________
Corrigido link NetFileEnum
--Vinícius --
Funcionou! muito obrigado!
Fernando Maia
Caros, estou precisando do inverso agora.

Abri um arquivo com os parâmetros TFileStream.Create('c:\teste.txt', fmShareExclusive ) e preciso em outra aplicação apenas ler o arquivo. Alguém sabe como?
Fernando Maia
Jhonas,

O link indicado não condiz com a minha necessidade.

Veja bem, na aplicação A, está sendo aberto um arquivo usando o comando “TFileStream.Create(file, fmShareExclusive ) “, ou seja, ele está sendo aberto em modo exclusivo. Eu preciso que a aplicação B acesse em modo de leitura o mesmo arquivo aberto em modo exclusivo pela aplicação A. Detalhe, eu não tenho acesso aos fontes da aplicação A.

Abraços
Jhonas
poste o seu código ... se não fica dificil ajudar

abraço
Fernando Maia
O código do comando utilizado já está acima,
CODE
TFileStream.Create(file, fmShareExclusive)
.

Eu preciso de um meio onde eu possa apenas ler ao mesmo tempo o mesmo arquivo.

Abraços
Jhonas
CODE
TFileStream.Create(file, fmShareExclusive)


QUOTE
Eu preciso de um meio onde eu possa apenas ler ao mesmo tempo o mesmo arquivo.


se voce abrir uma nova instancia do programa, sem problemas, mas se quiser abrir o arquivo em modo exclusivo mais de uma vez pelo mesmo programa, a idéia seria voce criar uma cópia do arquivo para abrir novamente.

abraço
Fernando Maia
Só que tem um problema, não posso fazer desta forma, pois preciso ler o arquivo constantemente.
Jhonas
a solução é voce usar uma query somente para leitura, usando select

ex: select * from tabela

abraço

Fernando Maia
Veja bem, não é banco de dados, é arquivo txt.
Jhonas
então seria assim

CODE
procedure TForm1.Button1Click(Sender: TObject);
var
   Arquivo: TextFile; Line : string;
begin
   AssignFile(Arquivo, 'C:\MinhaPasta\Arq.Txt');
   Reset(Arquivo);
   while not EOF(Arquivo) do
      begin
        ReadLn(Arquivo, Line);
        Memo1.Lines.Append(Line);
      end;
   CloseFile(Arquivo);
end;


abraço
Fernando Maia
Não foi possível ler o arquivo: I/O error 32.
Jhonas
acabei de fazer um teste aqui, funciona corretamente

CODE
procedure TForm1.Button1Click(Sender: TObject);
var
   Arquivo: TextFile; Line : string;
begin
   AssignFile(Arquivo, 'C:\Path.Txt');
   Reset(Arquivo);
   while not EOF(Arquivo) do
      begin
        ReadLn(Arquivo, Line);
        Memo1.Lines.Append(Line);
      end;
   CloseFile(Arquivo);
end;


verifique o seu arquivo txt

abraço
Fernando Maia
Ve só, o seu código funciona, o que não funcionou foi a execução do seu código junto com outro aplicativo abrindo o mesmo arquivo com o comando TFileStream.Create(file, fmShareExclusive)
Jhonas
acho que voce ainda não entendeu... quando voce abre um arquivo em modo exclusivo, significa que voce não quer dar acesso a outro enquanto voce não finalizar a ação pretendida sobre esse arquivo.

nesse caso voce usa o TFileStream.Create(file, fmShareExclusive)

exemplo:

CODE
function IsFileInUse(FileName: TFileName): Boolean;
var HFileRes: HFILE;
begin
  Result := False;
  if not FileExists(FileName) then Exit;
  HFileRes := CreateFile( PChar(FileName),
  GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL, 0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  //retorna false se o arquivo está em uso
  if not Result then CloseHandle(HFileRes);
end;

if NOT IsFileInUse(OutputFile)  then
   File := TFileStream.Create(OutputFile, fmCreate or  fmShareExclusive);


o exemplo usando:

CODE
procedure TForm1.Button1Click(Sender: TObject);
var
   Arquivo: TextFile; Line : string;
begin
   AssignFile(Arquivo, 'C:\Path.Txt');
   Reset(Arquivo);
   while not EOF(Arquivo) do
      begin
        ReadLn(Arquivo, Line);
        Memo1.Lines.Append(Line);
      end;
   CloseFile(Arquivo);
end;


permite que voce abra o mesmo arquivo mais de uma vez somente para leitura

abraço
Fernando Maia
Ok, que o arquivo fica bloqueado quando ele é aberto em modo exclusivo eu sei.

É exatamente essa a questão. Um aplicativo de terceiro, está abrindo o arquivo em modo exclusivo. Eu preciso abrir o arquivo ao mesmo tempo (como leitura).

Teoricamente eu não poderia abrir, mais sempre existe uma maneira de "driblar" esse controle que o S.O. impõe sobre o arquivo.
Micheus
QUOTE(Fernando Maia @ 14/01/2012 - 21:22) *
Um aplicativo de terceiro, está abrindo o arquivo em modo exclusivo. Eu preciso abrir o arquivo ao mesmo tempo (como leitura).
Até este momento, voce não tinha dito que era um aplicativo de terceiro...

QUOTE
Teoricamente eu não poderia abrir, mais sempre existe uma maneira de "driblar" esse controle que o S.O. impõe sobre o arquivo.
Neste caso não tem. Do contrário a integridade do próprio SO estaria comprometida.
Na verdade, até tem. Mas para isto voce teria que "matar" o processo que "lockou" o arquivo e, provavelmente, voce não vai querer fazer isto.

Se o aplicativo não fosse de terceiro, então voce poderia modificar o código daquele aplicativo para permitir a leitura e negar apenas a escrita para outros aplicativos.
- quando o arquivo está bloqueado por uma chamada à CreateFile, definindo o parâmetro dwShareMode com FILE_SHARE_READ em oposição ao valor 0;
- ou usando no parâmetro uStyle com OF_SHARE_DENY_WRITE em oposição à OF_SHARE_EXCLUSIVE, quando está bloqueado por uma chamada à OpenFile.

Se voce ainda tiver dúuvidas sobre sobre estas questões, poderá dar uma olhada na documentação no msdn: File Management Functions

Apenas destacando uma observação a respeito da Criação e Abertura de arquivos:
QUOTE
Creating and Opening Files
An application also uses CreateFile to specify whether it wants to share the file for reading, writing, both, or neither. This is known as the sharing mode. An open file that is not shared (dwShareMode set to zero) cannot be opened again, either by the application that opened it or by another application, until its handle has been closed. This is also referred to as exclusive access.
Resumindo...
Quando um arquivo é aberto em modo exclusivo, até mesmo a aplicação que o abriu não poderá abrí-lo (criar um novo handle) sem que antes o tenha fechado.


Abraços

* Se houver problema com o idioma inglês é só colar os links no tradutor do Google (não é perfeito, mas ajuda)
Esta é uma versão simplificada de nosso conteúdo principal. Para ver a versão completa com maiores informações, formatação e imagens, por favor clique aqui.
Invision Power Board © 2001-2012 Invision Power Services, Inc.