Думаю нет среди моих читателей человека, который не сталкивался бы с проблемой файлов “залоченных” другими процессами. Ситуация вобщем то простая, и естественная – программа, для работы с файлом, открывает его с доступом на запись, или для монопольного чтения. Подробности наверное интерисуют лишь программистов, а нам важно понять что за процесс открыл этот файл, и как его освободить. Для этого я обычно использую утилиту от Sysinternals – Handle.exe.
К примеру, захотелось мне удалить один файлик…
PS Q:\temp> del .\wlan-870isr.pdf
Remove-Item : Cannot remove item Q:\temp\wlan-870isr.pdf:
The process cannot access the file 'Q:\temp\wlan-870isr.pdf'
because it is being used by another process.
Не очень приятная ситуация, особенно если удалить файл очень надо, а процесс который его открыл – неизвестен. Ничего страшного, просто скармливаем имя файла (или его часть) утилите:
PS Q:\temp> handle wlan-870isr.pdf
Handle v3.41
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com
AcroRd32.exe pid: 3656 278: Q:\temp\wlan-870isr.pdf
Вот теперь нам известен виновник! Можно конечно просто завершить процесс Acrobat Reader’а, и все открытые им файлы будут освобождены:
PS Q:\temp> Stop-Process -Id 3656 -WhatIf
What if: Performing operation "Stop-Process" on Target "AcroRd32 (3656)".
Но что если мы не хотим завершать процесс, но при этом уверены что файл этой программе не нужен и она просто забыла его закрыть? Можно просто принудительно закрыть ссылку на файл (handle). Разумеется этого делать не рекомендуется если вы не уверены что всё кончится хорошо. Программа будет предполагать что файл всё еще открыт ею, и это может привести к неожиданным ошибкам. Но если очень хочется – то можно 😉
PS Q:\temp> handle -p 3656 -c 278
Handle v3.41
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com
278: File (---) Q:\temp\wlan-870isr.pdf
Close handle 278 in AcroRd32.exe (PID 3656)? (y/n) y
Handle closed.
Вот и готово. После этого, Acrobat Reader даже дал мне полистать несколько страниц документа, правда потом выдал ожидаемую ошибку 🙂
Возможно вам повезет больше 😉 Иногда эта функция действительно бывает полезна.
Кстати чтобы handle.exe не переспрашивал вас, можно добавить ключ –y