Process.Start를 사용하여 폴더를 엽니 다.


148

다른 주제를 보았는데 다른 문제가 있습니다. 프로세스가 시작되고 있지만 (작업 관리자에서 본) 폴더가 화면에서 열리지 않습니다. 뭐가 문제 야?

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

경로가 정확합니까?
Nathan Koop

1
왜 탐색기를 수동으로 호출 하시겠습니까? 폴더를 열지 마십시오. 즉 UseShellExecute가 true로 설정되고 동사가 "열기"로 설정된 ProcessStartInfo로 Process.Start를 호출하지 않습니까?
OregonGhost

1
예, 경로없이 'explorer.exe'를 열려고 시도했지만 작동하지 않았습니다.
Daniel

글쎄, 질문은 폴더를 여는 방법이 아니라 explorer.exe를 실행하여 폴더를 여는 방법이기 때문에 게시하지 않았습니다. 이유가있을 수 있기 때문에 처음에 탐색기를 직접 호출하려는 이유를 알고 싶었습니다.)
OregonGhost

여기서 옵션을 제외하고 싶기 때문에 이것은 어리석은 질문 일 수 있습니다. 모노를 사용하여 Linux 에서이 작업을 수행하지 않습니까? 우리는 Windows 환경을 이야기하고 있습니까?
Fredrik Mörk

답변:


266

" c:\teste" 폴더 가 존재 하는지 확인 했습니까 ? 그렇지 않으면 탐색기에서 기본 폴더 (내 경우에는 " C:\Users\[user name]\Documents")가 표시됩니다.

최신 정보

나는 다음과 같은 변형을 시도했다.

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

이 중 어느 것도 (예외를 던지는 것을 제외하고) 컴퓨터에서 작동하지 않으면 문제는 코드가 아니라 환경에 있다고 생각합니다. 이 경우 다음 중 하나 (또는 ​​둘 다)를 시도합니다.

  • 실행 대화 상자를 열고 "explorer.exe"를 입력 한 후 Enter 키를 누르십시오
  • 명령 프롬프트를 열고 "explorer.exe"를 입력 한 후 Enter 키를 누르십시오

글쎄, 나는 그것이 존재하지 않는다면, 어떤 방식 으로든 폴더를 열지 않겠습니까?
Daniel

글쎄, 그러면 환경 문제 일 수 있습니다. cmd를 통해 explorer.exe를 열고 normal을 열었습니다. 'Process.Start (@ "c : \ does_not_exist"); 예외를 던졌습니다
Daniel

1
탐색기 창이 이미 열려있는 경우 작은 차이 : Process.Start(path) 창을 활성화합니다 (작업 표시 줄에서만 깜박이고 앞쪽으로 가져 오지 않음). explorer.exe+ parameter는 항상 앞쪽에 새 창을 엽니 다 (그러나 같은 창에 여러 번). 둘 다 경고가 있습니다.
KekuSemau

Process.Start(@"c:\temp")주의해서 사용해야합니다. c:\temp.com존재하는 경우 함수 호출이 c:\temp.com대신 열립니다 . 자세한 내용은 forums.iis.net/p/1239773/2144186.aspx 를 참조하십시오.
Lex Li

Process.Start(@"c:\temp")같은 다른 폴더를 여는 취약 C:\temp.exeC:\temp.cmd. VS 자체가 버그가있는 동작을 나타내는이 문제를 참조하십시오 . explorer.exe변형을 사용하거나 (더 나은 IMO) 항상을 추가 하여이를 피할 수 있습니다 Path.DirectorySeparatorChar. 예를 들면 다음과 같습니다 Process.Start(@"C:\temp\").
binki

46

완전성을 위해 폴더를 열려면 다음을 사용하십시오.

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

Path.DirectorySeparatorChar폴더를 가리 키도록 FileName으로 끝나는 지 확인하십시오 . (@binki에게 감사합니다.)

이 솔루션은 동사를 나타내지 않으므로 폴더를 열고 항목을 선택하는 데는 작동하지 않습니다.


이것은 모노를 사용하는 Windows 및 Linux에서 모두 작동합니다.
Menno Deij-반 Rijswijk

1
이 방법을 사용 C:\teste.exe하거나 이와 같은 폴더를 사용하면 C:\teste.cmd탐색기가 원하는 폴더 대신 다른 폴더로 열립니다. 이를 피하기 위해 Path.DirectorySeparatorChar경로에 a 를 추가 할 수 있습니다 . VS 자체가 어떻게 같은 실수를하는지 보십시오 .
binki

"/ select"를 사용하는 @Scyssion의 대답에 따르면 사용할 수 있다고 생각할 수는 Verb = "select"있지만 아쉽습니다 . 어쨌든 큰 대답입니다!
idbrii

1
위의 대답과 달리 .NET Core 3에서 작동합니다. 설정 Verb = "open"이 필요하지 않았습니다. (Windows에서 테스트 한 결과, 다른 OS는 다를 수 있습니다.)
Walt D

( docs.microsoft.com/en-us/dotnet/api/… ) .Verbs속성에서 해당 동사를 얻을 수 있습니다.ProcessStartInfo
GaryNg

16

파일 또는 폴더를 선택하려면 다음을 사용할 수 있습니다.

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

2
대신 그것을 선택하는 폴더를 열려면 단지 변경 /select/open
SushiGuy

5

@ 기호를 사용하면 백 슬래시를 피할 필요가 없습니다.

@를 제거하거나 \\를 \로 바꿉니다.


여전히 폴더를 열지 않습니다 .. 프로세스 @ 작업 관리자 만 시작
Daniel

나는 시험 할 수 있었다, 더 이상의 제안이 2008 년 표현은 비주얼 C #으로 작동하도록
케빈 평신도

1
말은 ... 얼룩말. 뭔가 잘못은 ... 어쩌면 virii 또는가 someting, 당신의 탐색기와이
R. 마르틴 페르난데스

4

이스케이프 처리되지 않은 문자열을 사용할 때는 이중 백 슬래시가 필요하지 않습니다.

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

3

System.Diagnostics.Process.Start()과부하 중 하나를 사용해야합니다 . 아주 간단합니다!

실행하려는 프로세스의 파일 이름 ( explorer.exe) 을 저장하지 않으면 시스템은 파일 이름을 유효한 폴더 경로로 인식하고 이미 실행중인 Explorer 프로세스에 연결하려고 시도합니다. 이 경우 폴더가 이미 열려 있으면 탐색기에서 아무 작업도 수행하지 않습니다.

프로세스의 파일 이름을 배치 한 경우 시스템은 프로세스의 새 인스턴스를 실행하여 두 번째 문자열을 매개 변수로 전달합니다. 문자열이 유효한 폴더 인 경우 새로 만든 프로세스에서 열리 며 그렇지 않은 경우 새 프로세스는 아무 작업도 수행하지 않습니다.

어떤 경우에도 유효하지 않은 폴더 경로가 프로세스에 의해 처리되는 방법을 모르겠습니다. 사용 System.IO.Directory.Exists()하기에 충분해야합니다.


를 추가해야한다는 것을 잊지 마십시오 Path.DirectorySeparatorChar. 이름은 같지만의 폴더 그렇지 않은 경우, .cmd또는 .exe또는 가능한 다른 접미사도 존재 탐색기가 열립니다 다른 폴더 또는 그 실제로 실행 파일 또는 스크립트 경우, 그것은을 실행하는 대신 당신이 의도 한대로 폴더를 열어입니다.
binki

1

ProcessStartInfo 인스턴스를 사용하는 오버로드 된 메소드 버전을 사용하고 ProcessWindowStyle 특성을 적합한 값으로 설정하십시오.


1

at 기호가 대신 백 슬래시를 피하십시오.

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

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

이 코드는 VS2010 환경에서 제대로 작동하고 로컬 폴더를 올바르게 열지 만 IIS에서 동일한 응용 프로그램을 호스팅하고 열려고하면 확실히 실패합니다.


1

방금이 문제가 있었고 그 이유를 알았습니다. 내 이유는 여기에 나열되어 있지 않으므로이 문제를 겪는 사람 중 누구도 해결할 수 없습니다.

Visual Studio를 다른 사용자로 실행하고 Process.Start를 사용하려고하면 해당 사용자 컨텍스트에서 실행되고 화면에 표시되지 않습니다.


0

이상한.

explorer.exe를 찾을 수 없으면 예외가 발생합니다. 폴더를 찾을 수없는 경우 여전히 일부 폴더 (예 : 내 문서)를 열어야합니다.

작업 관리자에 다른 탐색기 사본이 표시되지만 볼 수는 없습니다.

오프 스크린 (예 : 다른 모니터)을 열 수 있습니까?

아니면 비 대화식 서비스에서이 작업을 수행하고 있습니까?


모니터가 하나 뿐이고 "탐색기의 다른 사본이 작업 관리자에 나타나지만 볼 수 없습니다"라고 말합니다. "그렇습니다. 비 대화식 서비스에서이 작업을 수행하고 있습니까?"
Daniel

작성중인 프로그램이 일반적인 winforms 프로그램과 달리 서비스 (기본적으로 백그라운드에서 완전히 실행되는)인지를 의미했습니다. (서비스가 무엇인지 모른다면 서비스를 작성하지 않았을 것입니다). 이 숨겨진 탐색기 창에서 '전환', '앞으로 가져 오기'또는 '최대화'를 선택하면 작업 관리자로 돌아가서 나타 납니까?
sgmoore

0

시작 메뉴에서 "explorer.exe c : \ teste"를 실행할 때 제대로 열립니다? 얼마나 오랫동안 노력 했습니까? 컴퓨터에 많은 프로세스가 있고 새 프로세스를 열 때 (IE라고 말하면) 비슷한 동작이 나타납니다. 작업 관리자에서 시작되지만 프런트 엔드에는 표시되지 않습니다. 다시 시작 했습니까?

다음 코드는 새 탐색기 인스턴스를 열어야합니다.

class sample{

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

0

이것을 시도 할 때 많은 응용 프로그램이 실행되고 있습니까? 창을 너무 많이 열어서 (앱이 많이 사용하는) 시스템에 GDI 핸들이 부족하여 때때로 이상한 동작이 발생합니다.

이런 일이 발생하면 GDI 핸들을 해제하기 위해 무언가를 닫을 때까지 창과 상황에 맞는 메뉴가 더 이상 나타나지 않습니다.

XP 및 Vista의 기본 제한은 10000입니다. DevStudio에서 1500 개의 GDI 핸들을 갖는 것은 드문 일이 아니므로 Dev studio 사본이 두 개 있으면 꽤 빨리 먹을 수 있습니다. TaskManager에 열을 추가하여 각 프로세스에서 사용중인 핸들 수를 확인할 수 있습니다.

한계를 늘리기 위해 할 수있는 레지스트리 조정이 있습니다.

자세한 내용은 http://msdn.microsoft.com/en-us/library/ms724291(VS.85).aspx를 참조하십시오 .


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.