2009-02-01 3 views
2

Как я могу найти, какие процессы имеют определенный файл, открытый и открытый, доступ и общие режимы? Кроме того, можно ли изменить эти значения для процесса? Или даже можно открыть файл для чтения, если он уже открыт для эксклюзивного доступа другим процессом?Как узнать, какой процесс открыл конкретный файл?

Обратите внимание: я не хочу аннулировать дескриптор процесса, открыв файл. Я просто хочу иметь доступ к файлу (если это возможно).

(я в основном спрашиваю о Windows, но решения для других платформ приветствуются, так как они способствуют знанию сообщества.)

Edit: Я нашел некоторые ответы на мой первый вопрос here и there.

Редактировать 2: Спасибо всем за упомянутые вами инструменты, но в основном я ищу программные методы (например, используя API Win32).

+0

@Hosam Aly: «но я в основном ищу программную технику»: возможно, вы должны поставить это в вопросе в следующий раз? –

+0

@ Митч, спасибо. Я сожалею о том, что. В следующий раз я буду более осторожен. –

+1

Очевидно, что [менеджер перезапуска] (http://blogs.msdn.com/b/oldnewthing/archive/2012/02/17/10268840.aspx) может сделать это для Windows Vista и более поздних версий. –

ответ

5
+0

Спасибо за помощь @Mitch. Примите мои извинения за то, что раньше не упоминал «программно». –

+0

@ Хосам Али: эй не проблема. Мой комментарий, вероятно, звучал немного суровым, о котором это не предназначалось. –

2

Существует утилита под названием Unlocker, который говорит вам, какой процесс получил блокировку на ресурс.

+0

Это действительно в моем списке «must-have» для Windows ... Я нахожу, хочу ли я этого или нет, в конечном итоге я устанавливаю его в течение недели после установки Windows. –

3

Для окон я знаю об инструменте от Sysinternal (www.sysinternals.com): handle.exe.

1

Для UNIX вы можете использовать fuser:

lnx0:i386_linux26> fuser -v a.cpp 

        USER  PID ACCESS COMMAND 
a.cpp    nabcdefg 3952 f.... less 
1

Это команда Lsof под системами Linux.

-1

Я не уверен, если есть способ сделать именно то, что вы хотите, но я знаю, что с помощью System.Diagnostics.Process класс (по крайней мере, в .NET), вы можете открыть процессы и следить за определенными свойствами:

System.Diagnostics.Process[] procArray = System.Diagnostics.Process.GetProcessesByName("notepad"); 
foreach (System.Diagnostics.Process proc in procArray) { 
    //do something with the process... 
} 

Осмотрите класс Process, возможно, есть свойство или коллекция, чтобы получить данные, которые вы ищете.

+0

Я уверен, что вы не можете проверить блокировки файлов по этому маршруту. –

+0

Возможно, используя Win32 api непосредственно через P/Invokes и получая дескриптор процесса с .Net? –

+0

Почему коммюнд проголосовал? Я просто не понимаю этого иногда ... –

Смежные вопросы