Apri una cartella usando Process.Start


148

Ho visto l' altro argomento e sto riscontrando un altro problema. Il processo si sta avviando (visto in Task Manager) ma la cartella non si apre sul mio schermo. Cosa c'è che non va?

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

sei sicuro che il tuo percorso sia corretto?
Nathan Koop,

1
Perché vuoi chiamare Explorer manualmente? Perché non aprire semplicemente la cartella, cioè chiamare Process.Start con ProcessStartInfo con UseShellExecute impostato su true e Verb impostato su "open"?
OregonGhost,

1
Sì, ho provato ad aprire "explorer.exe" senza il percorso e non ha funzionato neanche.
Daniel,

Bene, non ho pubblicato perché la domanda non è come aprire una cartella, ma piuttosto come eseguire explorer.exe per aprire una cartella. Volevo solo sapere perché vuoi invocare Explorer direttamente, in primo luogo, perché potrebbe esserci un motivo;)
OregonGhost

Voglio solo escludere le opzioni qui, quindi questa potrebbe essere una domanda stupida: non lo stai facendo in Linux usando mono, giusto? Stiamo parlando di un ambiente Windows?
Fredrik Mörk,

Risposte:


266

Hai fatto in modo che la cartella " c:\teste" esista? In caso contrario, Explorer si aprirà mostrando una cartella predefinita (nel mio caso " C:\Users\[user name]\Documents").

Aggiornare

Ho provato le seguenti varianti:

// 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");

Se nessuno di questi (beh, tranne quello che genera un'eccezione) funziona sul tuo computer, non penso che il problema risieda nel codice, ma nell'ambiente. In tal caso, proverei una (o entrambe) le seguenti:

  • Apri la finestra di dialogo Esegui, inserisci "explorer.exe" e premi invio
  • Apri un prompt dei comandi, digita "explorer.exe" e premi invio

Bene, ne sono sicuro e se non esistesse, aprirebbe qualsiasi cartella allo stesso modo o no?
Daniel,

Bene, allora potrebbe essere un problema ambientale .. Ho aperto explorer.exe tramite cmd e ho aperto normalmente. Nessuno dei Processs.Start ha funzionato tranne 'Process.Start (@ "c: \ does_not_exist");' che ha generato un'eccezione
Daniel,

1
Piccola differenza se quella finestra di Explorer è già aperta: Process.Start(path) attiva la finestra (può lampeggiare solo nella barra delle applicazioni, non in primo piano); explorer.exeIl parametro + apre una nuova finestra sempre in primo piano (ma più volte la stessa finestra). Quindi entrambi hanno avvertenze.
KekuSemau,

Process.Start(@"c:\temp")deve essere usato con cautela. Se c:\temp.comesiste, si aprirà c:\temp.cominvece la chiamata di funzione . Vedi forums.iis.net/p/1239773/2144186.aspx per maggiori dettagli.
Lex Li,

Si noti che Process.Start(@"c:\temp")è suscettibile di aprire una cartella diversa come C:\temp.exeo C:\temp.cmd. Vedi questo problema in cui VS stesso mostra un comportamento errato . Puoi evitarlo usando la explorer.exevariante o (meglio, IMO) aggiungendo sempre a Path.DirectorySeparatorChar. Ad esempio Process.Start(@"C:\temp\"),.
binki,

46

Solo per completezza, se tutto ciò che vuoi fare è aprire una cartella, usa questo:

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

Assicurarsi che FileName termini con Path.DirectorySeparatorCharper fare in modo che punti in modo inequivocabile a una cartella. (Grazie a @binki.)

Questa soluzione non funzionerà per l'apertura di una cartella e la selezione di un elemento, poiché non sembra esserci un verbo.


Questo funziona per me, sia su Windows che su Linux usando Mono.
Menno Deij - van Rijswijk,

1
Se si utilizza questo metodo e una cartella come C:\teste.exeo C:\teste.cmdesiste, Explorer si aprirà sull'altra cartella anziché su quella desiderata. Per evitare ciò, è possibile aggiungere Path.DirectorySeparatorChara al percorso. Guarda come VS stesso commette lo stesso errore .
binki,

Data la risposta di @ Scyssion usando "/ select", penseresti di poter usare Verb = "select", ma purtroppo non puoi. Indipendentemente da ciò, ottima risposta!
idbrii,

1
Questo funziona per me in .NET Core 3, a differenza della risposta accettata sopra. L'impostazione Verb = "open"non era necessaria. (Testato su Windows, altri SO potrebbero essere diversi.)
Walt D

È possibile ottenere i verbi applicabili dalla .Verbsproprietà su ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/… )
GaryNg

16

Se si desidera selezionare il file o la cartella è possibile utilizzare quanto segue:

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

2
Per aprire una cartella invece di selezionarla basta cambiare /selectin/open
SushiGuy

5

Stai utilizzando il simbolo @, che elimina la necessità di sfuggire alle barre rovesciate.

Rimuovere @ o sostituire \\ con \


Non si apre ancora la cartella. Solo l'avvio del process @ task manager
Daniel

Non ho ulteriori suggerimenti, sono stato in grado di testarlo e farlo funzionare in Visual C # express 2008
Kevin Laity,

1
Direi ... zebre. C'è qualcosa che non va nel tuo esploratore, forse virii o qualcosa del genere ...
R. Martinho Fernandes,

4

Non è necessaria la doppia barra rovesciata quando si utilizzano stringhe senza caratteri di escape:

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

3

Dovresti usare uno dei System.Diagnostics.Process.Start()sovraccarichi. È abbastanza semplice!

Se non si inserisce il nome file del processo che si desidera eseguire ( explorer.exe), il sistema lo riconoscerà come un percorso di cartella valido e tenterà di collegarlo al processo Explorer già in esecuzione. In questo caso, se la cartella è già aperta, Explorer non farà nulla.

Se si inserisce il nome file del processo (come è stato fatto), il sistema tenterà di eseguire una nuova istanza del processo, passando la seconda stringa come parametro. Se la stringa è una cartella valida, viene aperta sul processo appena creato, altrimenti il ​​nuovo processo non farà nulla.

In ogni caso non so come i percorsi delle cartelle non validi vengano trattati dal processo. L'uso System.IO.Directory.Exists()dovrebbe essere sufficiente per garantire questo.


Non dimenticare che devi aggiungere a Path.DirectorySeparatorChar. Altrimenti, se esiste anche una cartella con lo stesso nome ma .cmdo .exeforse anche altri suffissi, Explorer si aprirà su quell'altra cartella o se quelli sono effettivamente eseguibili o script, li eseguirà invece di aprire la cartella come previsto.
binki,

1

Utilizzare una versione sovraccaricata del metodo che accetta un'istanza ProcessStartInfo e impostare la proprietà ProcessWindowStyle su un valore adatto a voi.


1

Stai sfuggendo alla barra rovesciata quando il segno at lo fa per te.

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

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

Questo codice funziona bene dall'ambiente VS2010 e apre correttamente la cartella locale, ma se si ospita la stessa applicazione in IIS e si tenta di aprirla, fallirà sicuramente.


1

Ho appena avuto questo problema e ho scoperto il perché. la mia ragione non è elencata qui quindi chiunque altro ottenga questo problema e nessuno di questi risolva il problema.

Se si esegue Visual Studio come un altro utente e si tenta di utilizzare Process.Start verrà eseguito nel contesto di tali utenti e non verrà visualizzato sullo schermo.


0

Strano.

Se non riesce a trovare explorer.exe, dovresti ottenere un'eccezione. Se non riesce a trovare la cartella, dovrebbe comunque aprire alcune cartelle (ad es. I miei documenti)

Dici che un'altra copia di Explorer appare nel taskmanager, ma non riesci a vederlo.

È possibile che si stia aprendo fuori schermo (cioè un altro monitor)?

O per caso lo fai in un servizio non interattivo?


Ho solo 1 monitor e "Dici che nel Taskmanager appare un'altra copia di Explorer, ma non riesci a vederlo." questo è giusto .. Non so cosa volevi dire "O per caso lo fai in un servizio non interattivo?"
Daniel,

Volevo dire se il programma che stai scrivendo è un servizio (che per impostazione predefinita viene eseguito completamente in background) al contrario di un normale programma winforms. (Se non sai cos'è un servizio, è improbabile che tu ne stia scrivendo uno). Tornando al taskmanager, se selezioni "passa a", "porta in primo piano" o "ingrandisci" in questa finestra di Explorer nascosta, appare?
sgmoore,

0

Si apre correttamente quando si esegue "explorer.exe c: \ teste" dal menu di avvio? Da quanto tempo ci provi? Vedo un comportamento simile quando la mia macchina ha molti processi e quando apro un nuovo processo (i set dicono IE) .. inizia nel task manager ma non si presenta nel front-end. Hai provato un riavvio?

Il codice seguente dovrebbe aprire una nuova istanza di explorer

class sample{

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

0

Hai molte applicazioni in esecuzione quando stai provando questo? A volte incontro comportamenti strani sul lavoro perché il mio sistema esaurisce i GDI Handles poiché ho tante finestre aperte (le nostre app ne usano molte).

Quando ciò accade, le finestre e i menu di scelta rapida non vengono più visualizzati finché non chiudo qualcosa per liberare alcuni handle GDI.

Il limite predefinito in XP e Vista è 10000. Non è raro che il mio DevStudio abbia 1500 handle GDI, quindi se hai un paio di copie di Dev Studio aperte, può consumarle abbastanza rapidamente. È possibile aggiungere una colonna in TaskManager per vedere quanti handle vengono utilizzati da ciascun processo.

È possibile apportare una modifica al registro per aumentare il limite.

Per ulteriori informazioni, vedere http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

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

Basta cambiare il percorso o dichiararlo in a string

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.