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");
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");
Risposte:
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:
Process.Start(path)
attiva la finestra (può lampeggiare solo nella barra delle applicazioni, non in primo piano); explorer.exe
Il parametro + apre una nuova finestra sempre in primo piano (ma più volte la stessa finestra). Quindi entrambi hanno avvertenze.
Process.Start(@"c:\temp")
deve essere usato con cautela. Se c:\temp.com
esiste, si aprirà c:\temp.com
invece la chiamata di funzione . Vedi forums.iis.net/p/1239773/2144186.aspx per maggiori dettagli.
Process.Start(@"c:\temp")
è suscettibile di aprire una cartella diversa come C:\temp.exe
o C:\temp.cmd
. Vedi questo problema in cui VS stesso mostra un comportamento errato . Puoi evitarlo usando la explorer.exe
variante o (meglio, IMO) aggiungendo sempre a Path.DirectorySeparatorChar
. Ad esempio Process.Start(@"C:\temp\")
,.
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.DirectorySeparatorChar
per 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.
C:\teste.exe
o C:\teste.cmd
esiste, Explorer si aprirà sull'altra cartella anziché su quella desiderata. Per evitare ciò, è possibile aggiungere Path.DirectorySeparatorChar
a al percorso. Guarda come VS stesso commette lo stesso errore .
Verb = "select"
, ma purtroppo non puoi. Indipendentemente da ciò, ottima risposta!
Verb = "open"
non era necessaria. (Testato su Windows, altri SO potrebbero essere diversi.)
.Verbs
proprietà su ProcessStartInfo
( docs.microsoft.com/en-us/dotnet/api/… )
Stai utilizzando il simbolo @, che elimina la necessità di sfuggire alle barre rovesciate.
Rimuovere @ o sostituire \\ con \
Non è necessaria la doppia barra rovesciata quando si utilizzano stringhe senza caratteri di escape:
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
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.
Path.DirectorySeparatorChar
. Altrimenti, se esiste anche una cartella con lo stesso nome ma .cmd
o .exe
forse 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.
Utilizzare una versione sovraccaricata del metodo che accetta un'istanza ProcessStartInfo e impostare la proprietà ProcessWindowStyle su un valore adatto a voi.
Stai sfuggendo alla barra rovesciata quando il segno at lo fa per te.
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
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.
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.
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?
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");
}
}
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
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
Basta cambiare il percorso o dichiararlo in a string