Abra uma pasta usando Process.Start


148

Vi o outro tópico e estou tendo outro problema. O processo está iniciando (vi no gerenciador de tarefas), mas a pasta não está abrindo na minha tela. O que há de errado?

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

você tem certeza de que seu caminho está correto?
21139 Koop Nathan

1
Por que você deseja chamar o Explorer manualmente? Por que não abrir a pasta, ou seja, chame Process.Start com um ProcessStartInfo com UseShellExecute definido como true e Verb definido como "open"?
21412 OregonGhost #

1
Sim, tentei abrir o 'explorer.exe' sem o caminho e também não funcionou.
217 Daniel

Bem, eu não postei porque a pergunta não é como abrir uma pasta, mas como executar o explorer.exe para abrir uma pasta. Eu só queria saber por que você deseja chamar explorador diretamente em primeiro lugar, porque pode haver uma razão;)
OregonGhost

Eu só quero excluir opções aqui, então essa pode ser uma pergunta estúpida: você não está fazendo isso no Linux usando mono, certo? Estamos falando de um ambiente Windows?
11139 Fredrik Mörk

Respostas:


266

Você se certificou de que a pasta " c:\teste" exista? Caso contrário, o explorer abrirá mostrando uma pasta padrão (no meu caso " C:\Users\[user name]\Documents").

Atualizar

Eu tentei as seguintes variações:

// 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 nenhum deles (bem, exceto aquele que gera uma exceção) funcionar no seu computador, não acho que o problema esteja no código, mas no ambiente. Se for esse o caso, eu tentaria um (ou ambos) do seguinte:

  • Abra a caixa de diálogo Executar, digite "explorer.exe" e pressione Enter
  • Abra um prompt de comando, digite "explorer.exe" e pressione Enter

Bem, tenho certeza e se não existisse, abriria qualquer pasta da mesma maneira, ou não?
1574 Daniel

Bem, pode ser um problema de ambiente. Abri o explorer.exe através do cmd e abri o normal. Nenhum dos Processs.Start funcionou, exceto 'Process.Start (@ "c: \ does_not_exist");' que uma exceção
Daniel

1
Pequena diferença se a janela do explorer já estiver aberta: Process.Start(path) ativa a janela (só pode piscar na barra de tarefas, não trazida para a frente); explorer.exeO parâmetro + abre uma nova janela sempre na frente (mas várias vezes a mesma janela). Então, ambos têm advertências.
KekuSemau

Process.Start(@"c:\temp")deve ser usado com cautela. Se c:\temp.comexistir, a chamada da função será aberta c:\temp.com. Consulte forums.iis.net/p/1239773/2144186.aspx para obter mais detalhes.
Lex Li

Observe que Process.Start(@"c:\temp")é suscetível a abrir uma pasta diferente, como C:\temp.exeou C:\temp.cmd. Veja esse problema em que o próprio VS exibe comportamento de buggy . Você pode evitar isso usando a explorer.exevariante ou (melhor, IMO) sempre anexando a Path.DirectorySeparatorChar. Por exemplo Process.Start(@"C:\temp\"),.
binki

46

Apenas para completar, se tudo o que você deseja fazer é abrir uma pasta, use o seguinte:

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

Certifique-se de que FileName termine com Path.DirectorySeparatorCharpara que ele aponte inequivocamente para uma pasta. (Obrigado a @binki.)

Esta solução não funcionará para abrir uma pasta e selecionar um item, pois não parece haver um verbo para isso.


Isso funciona para mim, tanto no Windows quanto no Linux usando o Mono.
Menno Deij - van Rijswijk

1
Se você usar esse método e uma pasta como C:\teste.exeou C:\teste.cmdexistir, o Explorer abrirá para essa outra pasta em vez da que você pretendia. Para evitar isso, você pode anexar Path.DirectorySeparatorChara ao caminho. Veja como o próprio VS comete o mesmo erro .
binki

Dada a resposta de @ Scyssion usando "/ select", você pensaria que poderia usar Verb = "select", mas infelizmente não pode. Independentemente, ótima resposta!
Idbrii 24/07/19

1
Isso funciona para mim no .NET Core 3, ao contrário da resposta aceita acima. A configuração Verb = "open"não era necessária. (Testado no Windows, outros do sistema operacional podem ser diferentes.)
Walt D

Você pode obter os verbos aplicáveis ​​a partir da .Verbspropriedade em ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/… )
GaryNg

16

Se você deseja selecionar o arquivo ou a pasta, pode usar o seguinte:

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

2
Para abrir uma pasta em vez de selecioná-la, mude /selectpara/open
SushiGuy 13/09

5

Você está usando o símbolo @, o que elimina a necessidade de escapar das barras invertidas.

Remova o @ ou substitua \\ por \


Ainda não abrir a pasta .. Só iniciar o processo @ gerenciador de tarefas
Daniel

Eu não tenho mais sugestões, eu era capaz de teste e fazê-lo funcionar no Visual C # Express 2008
Kevin Leigos

1
Eu diria ... zebras. Há algo de errado com seu explorador, talvez virii ou someting ...
R. Martinho Fernandes

4

Você não precisa da barra invertida dupla ao usar cadeias sem escape:

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

3

Você deve usar uma das System.Diagnostics.Process.Start()sobrecargas. É bem simples!

Se você não colocar o nome do arquivo do processo que deseja executar ( explorer.exe), o sistema o reconhecerá como um caminho de pasta válido e tentará anexá-lo ao processo do Explorer já em execução. Nesse caso, se a pasta já estiver aberta, o Explorer não fará nada.

Se você colocar o nome do arquivo do processo (como você fez), o sistema tentará executar uma nova instância do processo, passando a segunda string como parâmetro. Se a sequência for uma pasta válida, ela será aberta no processo recém-criado; caso contrário, o novo processo não fará nada.

Não sei como os caminhos de pasta inválidos são tratados pelo processo em qualquer caso. Usar System.IO.Directory.Exists()deve ser suficiente para garantir isso.


Não esqueça que você precisa anexar a Path.DirectorySeparatorChar. Caso contrário, se uma pasta com o mesmo nome, mas .cmdou .exepossivelmente outros sufixos, também existir, o Explorer será aberto para essa outra pasta - ou, se forem realmente executáveis ​​ou scripts, ele será executado em vez de abrir a pasta como você deseja.
binki

1

Use uma versão sobrecarregada do método que usa uma instância ProcessStartInfo e defina a propriedade ProcessWindowStyle com um valor que funcione para você.


1

Você está escapando da barra invertida quando o sinal de arroba faz isso por você.

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

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

Esse código funciona bem no ambiente do VS2010 e abre a pasta local corretamente, mas se você hospedar o mesmo aplicativo no IIS e tentar abrir, ele falhará com certeza.


1

Acabei de ter esse problema e descobri o porquê. minha razão não está listada aqui; portanto, qualquer pessoa que receba esse problema e nenhum deles o corrija.

Se você executar o Visual Studio como outro usuário e tentar usar Process.Start, ele será executado nesse contexto de usuários e você não o verá na tela.


0

Estranho.

Se não conseguir encontrar o explorer.exe, você deve receber uma exceção. Se não conseguir encontrar a pasta, ainda deve abrir alguma pasta (por exemplo, meus documentos)

Você diz que outra cópia do Explorer aparece no gerenciador de tarefas, mas não pode vê-la.

É possível que esteja abrindo fora da tela (ou seja, outro monitor)?

Ou, por acaso, você está fazendo isso em um serviço não interativo?


Eu tenho apenas um monitor e "Você diz que outra cópia do Explorer aparece no gerenciador de tarefas, mas não pode vê-la". está certo .. Eu não sei o que você quis dizer "Ou você está fazendo isso por acaso em um serviço não interativo?"
217 Daniel

Eu quis dizer se o programa que você está escrevendo é um serviço (que por padrão é executado completamente em segundo plano), em oposição a um programa winforms normal. (Se você não sabe o que é um serviço, é improvável que esteja escrevendo um). Voltando ao taskmanager, se você selecionar 'alternar para', 'trazer para a frente' ou 'maximizar' nesta janela do explorador oculto, ele aparecerá?
Sgmoore 15/07/2009

0

Ele abre corretamente quando você executa o "explorer.exe c: \ teste" no menu Iniciar? Há quanto tempo você está tentando isso? Vejo um comportamento semelhante quando minha máquina possui muitos processos e quando abro um novo processo (os conjuntos dizem o IE). Ele inicia no gerenciador de tarefas, mas não aparece no front end. Você tentou reiniciar?

O código a seguir deve abrir uma nova instância do explorer

class sample{

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

0

Você tem muitos aplicativos em execução quando está tentando isso? Às vezes, encontro um comportamento estranho no trabalho porque meu sistema fica sem os identificadores GDI, pois tenho muitas janelas abertas (nossos aplicativos usam muito).

Quando isso acontece, as janelas e os menus de contexto não aparecem mais até eu fechar algo para liberar alguns identificadores de GDI.

O limite padrão no XP e no Vista é 10000. Não é incomum que meu DevStudio tenha 1500 identificadores de GDI, portanto, se você tiver algumas cópias do Dev studio abertas, poderá consumi-las rapidamente. Você pode adicionar uma coluna no TaskManager para ver quantas alças estão sendo usadas por cada processo.

Há um ajuste no registro que você pode fazer para aumentar o limite.

Para obter mais informações, consulte http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx


0

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

Apenas mude o caminho ou declare-o em um string

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.