Otwórz folder za pomocą Process.Start


148

Widziałem inny temat i mam inny problem. Proces się rozpoczyna (zobaczyłem w menedżerze zadań), ale folder nie otwiera się na moim ekranie. Co jest nie tak?

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

czy jesteś pewien, że twoja ścieżka jest prawidłowa?
Nathan Koop

1
Dlaczego chcesz ręcznie wywołać Eksploratora? Dlaczego po prostu nie otworzyć folderu, tj. Wywołać Process.Start z ProcessStartInfo z UseShellExecute ustawionym na true i Verb ustawionym na „open”?
OregonGhost,

1
Tak, próbowałem otworzyć plik „explorer.exe” bez ścieżki i też nie działał.
Daniel,

Cóż, nie opublikowałem, ponieważ nie chodzi o to, jak otworzyć folder, ale raczej o to, jak uruchomić program explorer.exe, aby otworzyć folder. Chciałem tylko wiedzieć, dlaczego chcesz wywołać eksploratora bezpośrednio w pierwszej kolejności, ponieważ może być powód;)
OregonGhost

Chcę tutaj tylko wykluczyć opcje, więc może to być głupie pytanie: nie robisz tego w Linuksie przy użyciu mono, prawda? Mówimy o środowisku Windows?
Fredrik Mörk,

Odpowiedzi:


266

Czy upewniłeś się, że folder „ c:\teste” istnieje? Jeśli tak się nie stanie, eksplorator otworzy się, pokazując domyślny folder (w moim przypadku „ C:\Users\[user name]\Documents”).

Aktualizacja

Wypróbowałem następujące odmiany:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

Jeśli żaden z nich (no cóż, poza tym, który zgłasza wyjątek) nie działa na twoim komputerze, nie sądzę, że problem leży w kodzie, ale w środowisku. W takim przypadku spróbuję jednego (lub obu) z poniższych:

  • Otwórz okno dialogowe Uruchom, wpisz „explorer.exe” i naciśnij Enter
  • Otwórz wiersz polecenia, wpisz „explorer.exe” i naciśnij Enter

Cóż, jestem pewien i gdyby nie istniał, otworzyłby się jakikolwiek folder w ten sam sposób, czy nie?
Daniel,

Cóż, może to być problem ze środowiskiem .. Otworzyłem explorer.exe przez cmd i otworzyłem normalnie .. Żaden z procesów.Start nie działał z wyjątkiem 'Process.Start (@ "c: \ does_not_exist");' który rzucił wyjątek
Daniel

1
Mała różnica, jeśli to okno eksploratora jest już otwarte: Process.Start(path) aktywuje okno (może migać tylko na pasku zadań, nie jest przenoszone na wierzch); explorer.exe+ parametr otwiera nowe okno zawsze z przodu (ale wielokrotnie to samo okno). Więc obaj mają zastrzeżenia.
KekuSemau

Process.Start(@"c:\temp")należy używać ostrożnie. Jeśli c:\temp.comistnieje, c:\temp.comzamiast tego zostanie otwarte wywołanie funkcji . Więcej informacji można znaleźć na forums.iis.net/p/1239773/2144186.aspx .
Lex Li

Zwróć uwagę, że może Process.Start(@"c:\temp")to spowodować otwarcie innego folderu, takiego jak C:\temp.exelub C:\temp.cmd. Zobacz ten problem, w którym sam VS wykazuje błędne zachowanie . Możesz tego uniknąć, używając explorer.exewariantu lub (lepiej, IMO) zawsze dołączając plik Path.DirectorySeparatorChar. Na przykład Process.Start(@"C:\temp\").
binki

46

Dla kompletności, jeśli wszystko, co chcesz zrobić, to otworzyć folder, użyj tego:

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

Upewnij się, że nazwa_pliku kończy się Path.DirectorySeparatorCharna, aby jednoznacznie wskazywała na folder. (Dzięki @binki.)

To rozwiązanie nie będzie działać w przypadku otwierania folderu i wybierania elementu, ponieważ nie wydaje się, aby to oznaczało.


To działa dla mnie, zarówno w systemie Windows, jak i Linux przy użyciu Mono.
Menno Deij - van Rijswijk

1
Jeśli użyjesz tej metody i folderu takiego jak C:\teste.exelub C:\teste.cmdistnieje, Eksplorator otworzy się do tego innego folderu zamiast tego, który zamierzałeś. Aby tego uniknąć, możesz dołączyć Path.DirectorySeparatorChardo ścieżki. Zobacz, jak sam VS popełnia ten sam błąd .
binki

Biorąc pod uwagę odpowiedź @ Scyssion za pomocą "/ select", pomyślałbyś, że możesz użyć Verb = "select", ale niestety nie możesz. Niezależnie od tego, świetna odpowiedź!
idbrii

1
To działa dla mnie w .NET Core 3, w przeciwieństwie do powyższej zaakceptowanej odpowiedzi. Ustawienie Verb = "open"nie było konieczne. (Testowane w systemie Windows, inne systemy operacyjne mogą się różnić.)
Walt D,

Odpowiednie czasowniki można pobrać z .Verbswłaściwości pod adresemProcessStartInfo ( docs.microsoft.com/en-us/dotnet/api/… )
GaryNg

16

Jeśli chcesz wybrać plik lub folder, możesz skorzystać z:

Process.Start("explorer.exe", "/select, c:\\teste");

2
Aby otworzyć folder zamiast go wybierać, po prostu zmień /selectna/open
SushiGuy

5

Używasz symbolu @, który eliminuje potrzebę ucieczki przed ukośnikami odwrotnymi.

Usuń znak @ lub zamień \\ na \


Wciąż nie otwieram folderu. Dopiero uruchamiam proces @ task manager
Daniel

Nie mam dalszych sugestii, udało mi się przetestować i sprawić, by działało w Visual C # express 2008
Kevin Laity

1
Powiedziałbym ... zebry. Coś jest nie tak z twoim odkrywcą, może virii lub coś takiego ...
R. Martinho Fernandes.

4

Nie potrzebujesz podwójnego odwrotnego ukośnika, gdy używasz ciągów bez znaku zmiany znaczenia:

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

3

Powinieneś użyć jednego z System.Diagnostics.Process.Start() przeciążeń. To całkiem proste!

Jeśli nie umieścisz nazwy pliku procesu, który chcesz uruchomić ( explorer.exe), system rozpozna go jako prawidłową ścieżkę do folderu i spróbuje dołączyć go do już działającego procesu Eksploratora. W takim przypadku, jeśli folder jest już otwarty, Explorer nic nie zrobi.

Jeśli umieścisz nazwę pliku procesu (tak jak to zrobiłeś), system spróbuje uruchomić nową instancję procesu, przekazując drugi ciąg jako parametr. Jeśli ciąg jest prawidłowym folderem, jest otwierany w nowo utworzonym procesie, jeśli nie, nowy proces nic nie zrobi.

W każdym razie nie wiem, jak nieprawidłowe ścieżki folderów są traktowane przez proces. Użycie System.IO.Directory.Exists()powinno wystarczyć, aby to zapewnić.


Nie zapominaj, że musisz dołączyć rozszerzenie Path.DirectorySeparatorChar. W przeciwnym razie, jeśli istnieje folder o tej samej nazwie, ale .cmdlub .exeewentualnie z innymi przyrostkami, Eksplorator otworzy się do tego innego folderu - lub jeśli są to pliki wykonywalne lub skrypty, uruchomi je zamiast otwierania folderu zgodnie z zamierzeniami.
binki

1

Użyj przeciążonej wersji metody, która przyjmuje wystąpienie ProcessStartInfo i ustaw właściwość ProcessWindowStyle na wartość, która działa dla Ciebie.


1

Uciekasz przed ukośnikiem odwrotnym, gdy znak „at” robi to za Ciebie.

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

Ten kod działa dobrze w środowisku VS2010 i poprawnie otwiera folder lokalny, ale jeśli hostujesz tę samą aplikację w usługach IIS i spróbujesz otworzyć, na pewno się to nie powiedzie.


1

Właśnie miałem ten problem i dowiedziałem się, dlaczego. mój powód nie jest tutaj wymieniony, więc każdy, kto napotka ten problem, i żaden z nich go nie naprawia.

Jeśli uruchomisz Visual Studio jako inny użytkownik i spróbujesz użyć Process.Start, będzie on działał w tym kontekście użytkownika i nie zobaczysz go na ekranie.


0

Dziwne.

Jeśli nie może znaleźć explorer.exe, powinieneś otrzymać wyjątek. Jeśli nie może znaleźć folderu, powinien nadal otworzyć jakiś folder (np. Moje dokumenty)

Mówisz, że w menedżerze zadań pojawia się kolejna kopia Eksploratora, ale nie możesz jej zobaczyć.

Czy to możliwe, że otwiera się poza ekranem (np. Inny monitor)?

A może przypadkiem robisz to w usłudze nieinteraktywnej?


Mam tylko 1 monitor i „Mówisz, że w menedżerze zadań pojawia się inna kopia Eksploratora, ale nie możesz jej zobaczyć”. to prawda .. Nie wiem, co miałeś na myśli "Czy może robisz to przypadkiem w usłudze nieinteraktywnej?"
Daniel,

Miałem na myśli, że program, który piszesz, jest usługą (która domyślnie działa całkowicie w tle) w przeciwieństwie do normalnego programu winForms. (Jeśli nie wiesz, co to jest usługa, jest mało prawdopodobne, że ją piszesz). Wracając do menedżera zadań, czy jeśli w tym ukrytym oknie eksploratora wybierzesz opcję „przełącz na”, „przenieś na wierzch” lub „maksymalizuj”?
sgmoore,

0

Czy otwiera się poprawnie po uruchomieniu „explorer.exe c: \ teste” z menu Start? Jak długo tego próbujesz? Widzę podobne zachowanie, gdy mój komputer ma wiele procesów i kiedy otwieram nowy proces (ustawia np. IE) .. uruchamia się w menedżerze zadań, ale nie pojawia się w interfejsie. Czy próbowałeś ponownie uruchomić?

Poniższy kod powinien otwierać nowe wystąpienie eksploratora

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

Czy podczas próby masz uruchomionych wiele aplikacji? Czasami napotykam dziwne zachowanie w pracy, ponieważ w moim systemie zabrakło uchwytów GDI, ponieważ mam otwartych wiele okien (nasze aplikacje używają dużo).

Kiedy tak się dzieje, okna i menu kontekstowe nie pojawiają się długo, dopóki coś nie zamknę, aby zwolnić niektóre uchwyty GDI.

Domyślny limit w XP i Vista to 10000. Nie jest niczym niezwykłym, że moje DevStudio ma 1500 uchwytów GDI, więc jeśli masz kilka otwartych kopii Dev Studio, może je dość szybko pochłonąć. Możesz dodać kolumnę w TaskManager, aby zobaczyć, ile uchwytów jest używanych przez każdy proces.

Istnieje modyfikacja rejestru, którą możesz zrobić, aby zwiększyć limit.

Więcej informacji można znaleźć pod adresem http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

Po prostu zmień ścieżkę lub zadeklaruj ją w pliku string

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.