Delphi: Verifique se o arquivo está em uso
Pergunta
Eu quero escrever para / excluir um arquivo, mas às vezes eu fico um acidente se o arquivo está em uso por outro programa. Como posso verificar se o arquivo é aberto por outro processo ou eu posso abri-lo para a escrita?
Solução
O problema é que, entre o momento em que você verificar para ver se você pode obter acesso exclusivo e abrir o arquivo, outra coisa tem acesso exclusivo ao arquivo, e você começa a exceção de qualquer maneira.
A única enganar maneira à prova para ver se você pode obter um bloqueio exclusivo em um arquivo é para tentar obter um bloqueio exclusivo no arquivo, se você consegue, você tê-lo.
Se não, você capturar a exceção, e quer
- Vá fazer outra coisa
- Aguarde um pouco e tente novamente
É uma das situações da vida em que é melhor pedir perdão do que permissão:)
Outras dicas
Há uma nova maneira de obter a origem do bloqueio de arquivos para o Vista e até aqui: http: // www. remkoweijnen.nl/blog/2011/01/03/cannot-access-files-but-need-the-origin/
UserMode: A melhor maneira de escrever para um arquivo bloqueado é perguntar ao usuário para fechá-lo em outro processo. Em processos descontínuos que você deve ignorar tal arquivo um e registrar o problema. Fornecendo o nome de outro processo é uma maneira muito boa para encontrar uma solução para o usuário.
Não tenho certeza em que a programação idioma que você gostaria de verificar se você pode escrever para um arquivo. Em Java, java.io .File.canWrite () pode fazer o trabalho para você.
Geral:
No UNIX-like OS, você pode usar o comando lsof .
Se você quiser ver qual o programa que contém um identificador para o arquivo, use o Process monitor (download da Microsoft).
Esta ferramenta tem uma interface de linha de comando, assim que você poderia usar do seu idioma da interface scripting (por exemplo java.lang.Process
) para executar a ferramenta e exibir uma mensagem de erro útil.
IsFileInUse como dado na http://delphi.about.com/cs /adptips1999/a/bltip0999_3.htm