Guest --Vinícius -- Postado Março 4, 2008 Denunciar Share Postado Março 4, 2008 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Março 4, 2008 Denunciar Share Postado Março 4, 2008 (editado) 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 Janeiro 15, 2012 por Micheus Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Guest --Vinícius -- Postado Março 11, 2008 Denunciar Share Postado Março 11, 2008 Funcionou! muito obrigado! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Abril 5, 2011 Denunciar Share Postado Abril 5, 2011 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 5, 2011 Denunciar Share Postado Abril 5, 2011 vejahttp://www.ramosdainformatica.com.br/art_r...s01.php?CDA=466abraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Abril 6, 2011 Denunciar Share Postado Abril 6, 2011 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 6, 2011 Denunciar Share Postado Abril 6, 2011 poste o seu código ... se não fica dificil ajudarabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Abril 7, 2011 Denunciar Share Postado Abril 7, 2011 O código do comando utilizado já está acima, TFileStream.Create(file, fmShareExclusive).Eu preciso de um meio onde eu possa apenas ler ao mesmo tempo o mesmo arquivo.Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 9, 2011 Denunciar Share Postado Abril 9, 2011 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Abril 12, 2011 Denunciar Share Postado Abril 12, 2011 Só que tem um problema, não posso fazer desta forma, pois preciso ler o arquivo constantemente. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 12, 2011 Denunciar Share Postado Abril 12, 2011 a solução é voce usar uma query somente para leitura, usando selectex: select * from tabelaabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Abril 12, 2011 Denunciar Share Postado Abril 12, 2011 Veja bem, não é banco de dados, é arquivo txt. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 12, 2011 Denunciar Share Postado Abril 12, 2011 então seria assimprocedure 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Abril 13, 2011 Denunciar Share Postado Abril 13, 2011 Não foi possível ler o arquivo: I/O error 32. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 13, 2011 Denunciar Share Postado Abril 13, 2011 acabei de fazer um teste aqui, funciona corretamenteprocedure 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 txtabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Abril 13, 2011 Denunciar Share Postado Abril 13, 2011 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) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Jhonas Postado Abril 14, 2011 Denunciar Share Postado Abril 14, 2011 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 leituraabraço Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Fernando Maia Postado Janeiro 14, 2012 Denunciar Share Postado Janeiro 14, 2012 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Micheus Postado Janeiro 15, 2012 Denunciar Share Postado Janeiro 15, 2012 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 FunctionsApenas destacando uma observação a respeito da Criação e Abertura de arquivos:Creating and Opening FilesAn 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) Citar Link para o comentário Compartilhar em outros sites More sharing options...
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
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.