Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Arquivo em uso ou modo exclusivo


Guest --Vinícius --

Pergunta

Guest --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!

Link para o comentário
Compartilhar em outros sites

18 respostass a esta questão

Posts Recomendados

  • 0
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:

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).

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

Editado por Micheus
Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

TFileStream.Create(file, fmShareExclusive)

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

Link para o comentário
Compartilhar em outros sites

  • 0

então seria assim

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

Link para o comentário
Compartilhar em outros sites

  • 0

acabei de fazer um teste aqui, funciona corretamente

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

Link para o comentário
Compartilhar em outros sites

  • 0

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:

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:
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

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

  • 0
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...

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:

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)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...