Pergunta

Eu estou tentando escrever um utilitário que permitirá mover arquivos no Windows, e quando encontra um arquivo em uso, irá definir o arquivo a ser movido na reinicialização.

Parece que MoveFileEx ( http: // MSDN .microsoft.com / en-us / library / aa365240 (VS.85) .aspx ) é a chamada direita para isso, porém eu não consigo descobrir o código de erro que eu estou procurando de GetLastError ( http://msdn.microsoft.com/en-us/library/ ms679360 (VS.85) .aspx ) para ver que o arquivo estava em uso.

Eu quero o utilitário falhar quando há um problema de permissões real. Existe uma maneira de diferenciar um you-can not write-lá e um erro de substituição em uso?

Além disso, se eu tenho os arquivos que eu estou movendo na pasta temporária do usuário, eles vão ficar excluído antes da renomeação atrasada?

Foi útil?

Solução

Você tem que chamar CreateFile primeiro para ver se o arquivo está em uso.

Para ver se o arquivo está em uso:

Se você receber um identificador de arquivo válido, então você sabe que o arquivo não ter conflito de compartilhamento permissões com um processo que já tem este arquivo aberto.

Se você não especificar o acesso de compartilhamento (0 ao parâmetro dwShareMode da chamada CreateFile), então você não terá um identificador de arquivo se qualquer outro processo está usando esse arquivo de qualquer forma. GetLastError neste caso seria voltar: ERROR_SHARING_VIOLATION (32)


Para ver se há um problema de segurança com acesso ao arquivo:

Para ver se há um problema de permissões acessar esse arquivo, a chamada CreateFile também falhará, mas com um GetLastError diferente. Você vai ter: ERROR_ACCESS_DENIED (5)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top