Jak mogę sprawdzić, czy określony plik jest otwarty w systemie Windows? [Zamknięte]


87

Jednym z moich ulubionych narzędzi dla Linuksa jest lsof - prawdziwy szwajcarski scyzoryk!

Dzisiaj zacząłem się zastanawiać, które programy w systemie WinXP mają otwarty określony plik. Czy istnieje równoważne narzędzie do lsof? Dodatkowo plik, o którym mowa, znajdował się w udziale sieciowym, więc nie jestem pewien, czy to komplikuje sprawę.

Odpowiedzi:


74

Użyj Process Explorer z Sysinternals Suite, funkcja Znajdź uchwyt lub DLL pozwoli ci wyszukać proces przy otwartym pliku.


Czy to naprawdę odpowiada na pytanie? Process Explorer pozwala zobaczyć, które pliki są otwarte dla określonego procesu / uchwytu / dll / cokolwiek, ale to odwrotne mapowanie. Zobacz moją odpowiedź stackoverflow.com/questions/15708/… na to pytanie.
Greg Mattes,

6
Tak. Kliknij Znajdź uchwyt lub Dll (lub naciśnij Ctrl-F), wpisz nazwę pliku, którego szukasz, a otrzymasz listę procesów z otwartym plikiem.
Jay Hofacker

Nazwa Process Explorer została teraz zmieniona i dołączona do „Process Monitor”.
Matthew McCullough

7
@MatthewMcCullough Wszelkie odniesienia? Nie masz racji, Process Explorer i Process Monitor to dwa różne narzędzia.
Alois Mahdal

2
Czy Process Explorer ma interfejs wiersza poleceń?
Anderson Green

41

Odpowiednikiem lsof -p pidjest połączone wyjście z uchwytu sysinternals i listdlls, tj

handle -p pid
listdlls -p pid

możesz dowiedzieć się pid z sysinternals pslist.


Czy jest to standardowa instalacja systemu Windows, taka jak Windows 10?
Morten

10

Spróbuj Handle . Filemon i Regmon są również świetne do próbowania dowiedzieć się, co program duce foo robi z twoim systemem.


@slipsec FileMon i Regmon są teraz zastępowane przez Process Monitor v3.2 w wersjach systemu Windows zaczynających się od Windows 2000 SP4, Windows XP SP2, Windows Server 2003 SP1 i Windows Vista.
Lucky

7

Jeden odpowiednik lsof można połączyć wyjście z uchwytu Sysinternals i plików listdll , tj .:

c:\SysInternals>handle
[...]
------------------------------------------------------------------------------
gvim.exe pid: 5380 FOO\alois.mahdal
   10: File  (RW-)   C:\Windows
   1C: File  (RW-)   D:\some\locked\path\OpenFile.txt
[...]

c:\SysInternals>listdlls
[...]
------------------------------------------------------------------------------
Listdlls.exe pid: 6840
Command line: listdlls

  Base        Size      Version         Path
  0x00400000  0x29000   2.25.0000.0000  D:\opt\SysinternalsSuite\Listdlls.exe
  0x76ed0000  0x180000  6.01.7601.17725  C:\Windows\SysWOW64\ntdll.dll
[...]

c:\SysInternals>listdlls

Niestety, aby móc z nich korzystać, musisz "uruchomić jako Administrator".

Również listdll i uchwyt nie tworzą ciągłej postaci tabelarycznej, więc filtrowanie nazwy pliku mogłoby ukryć PID. findstr /c:pid: /c:<filename>powinien jednak zbliżyć Cię do obu narzędzi

c:\SysinternalsSuite>handle | findstr /c:pid: /c:Driver.pm
System pid: 4 \<unable to open process>
smss.exe pid: 308 NT AUTHORITY\SYSTEM
avgrsa.exe pid: 384 NT AUTHORITY\SYSTEM
[...]
cmd.exe pid: 7140 FOO\alois.mahdal
conhost.exe pid: 1212 FOO\alois.mahdal
gvim.exe pid: 3408 FOO\alois.mahdal
  188: File  (RW-)   D:\some\locked\path\OpenFile.txt
taskmgr.exe pid: 6016 FOO\alois.mahdal
[...]

Tutaj widzimy, że gvim.exe jest tym, który ma otwarty ten plik.


5

Wypróbuj Unlocker .

Witryna Unlocker ma fajny wykres (przewiń w dół po kliknięciu linku), który pokazuje porównanie z innymi narzędziami. Oczywiście takie porównania są zwykle nieobiektywne, ponieważ są zwykle pisane przez autora narzędzia, ale tabela przynajmniej wymienia alternatywy, abyś mógł je samemu wypróbować.


4
Unlocker wyświetla tylko pliki zablokowane, a nie otwarte. Większość oprogramowania Windows blokuje używaną bibliotekę DLL, ale nie blokuje dokumentów.
Tobias

5

Jeśli plik jest plikiem .dll, możesz użyć aplikacji wiersza poleceń TaskList, aby sprawdzić, kto go otworzył:

TaskList /M nameof.dll

3

Jest program „OpenFiles”, który wydaje się być częścią systemu Windows 7. Wygląda na to, że może robić, co chcesz. Może wyświetlać pliki otwierane przez użytkowników zdalnych (poprzez współdzielenie plików), a po wywołaniu „openfiles / Local on” i ponownym uruchomieniu systemu powinien być w stanie pokazać pliki otwarte lokalnie. Mówi się, że ten ostatni ma kary za wydajność.


1
Przychodzę tutaj, szukając sposobu, aby dowiedzieć się, kto uniemożliwia mi usunięcie folderu i uniknięcie ponownego uruchomienia, i uważam, że polecenie, którego potrzebuję, wymaga konfiguracji konfiguracji, która ... zgadłeś ... wymaga ponownego uruchomienia. Jak bardzo okna.
Gus

ludzie, pamiętajcie, że uruchomienie polecenia openfiles zajmuje DŁUGO (w kolejności 4 minuty)!
NH.

2

Jeśli klikniesz prawym przyciskiem myszy ikonę „Komputer” (lub „Mój komputer”) i wybierzesz „Zarządzaj” z wyskakującego menu, przejdziesz do konsoli zarządzania komputerem.

Tam, w obszarze Narzędzia systemowe \ Foldery współdzielone, znajdziesz „Otwórz pliki”. Prawdopodobnie jest to bliskie temu, czego chcesz, ale jeśli plik znajduje się w udziale sieciowym, musisz zrobić to samo na serwerze, na którym znajduje się plik.


3
Zauważ, że pokazuje to tylko udostępnione pliki, które są otwarte przez innych użytkowników sieci. Nie pomaga znaleźć plików otwartych w systemie lokalnym. Zrobienie tego na serwerze prawdopodobnie powie ci, który użytkownik otworzył plik, ale nie powie, który program na komputerze tego użytkownika. Process Explorer (jak wspomniał @JayHofacker) działał dobrze dla mnie.
tomlogic

2

Użyj Process Explorer, aby znaleźć identyfikator procesu. Następnie użyj uchwytu aby dowiedzieć się, które pliki są otwarte.

Np. Uchwyt -p

Podoba mi się to podejście, ponieważ używasz narzędzi samego Microsoft.


gdybyśmy tylko mieli do nich kod źródłowy
graywolf

2

W OpenedFilesView , w menu Opcje, znajduje się pozycja menu o nazwie „Pokaż pliki sieciowe”. Być może z włączoną tą funkcją wspomniane narzędzie jest do pewnego użytku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.