2010-08-06 6 views
3

내 winform에 folderBrowserDialog를 사용하고 있습니다.folderbrowserdialog on C# winforms

기본 또는 초기 경로가 네트워크 위치 여야합니다. 예를 들어 대한

는 :

folderBrowserDialog1.SelectedPath = @"\\server1\foo\bar\"; 

이 작동하지 않습니다. 내 시스템이 올바른 네트워크에 있고 브라우저를 통해 디렉토리에 액세스하여 명령을 실행할 수 있습니다.

이 기능이 아닌가요? 또는 해결 방법이 있습니까? 누군가 나를 통해 나를 안내 할 수 있으면 감사하겠습니다! 당신이 \\name 규칙을 사용하여 네트워크 리소스에 액세스 할 때

덕분에, 바르

+0

코드를 단계별로 실행할 때 예외가 발생합니까? – cristobalito

+2

내 컴퓨터 (WinXP SP3, Visual C# Express 2008)에서이를 테스트했으며 정상적으로 작동합니다. 실패에 대해 자세히 설명해 주시겠습니까? 시도했을 때 무엇을 보았습니까? 어떤 OS와 C#을 사용하고 있습니까? – sidewinderguy

+0

@cristobalito :이 예외는 발생하지 않으며 기본 폴더 ("내 컴퓨터")보기로 이동합니다. @sidewinderguy : 같은 핀치! Win XP SP3에서 Visual C# Professional Edition 2008을 사용하고 있습니다 ... ShowDialog가 기본적으로 네트워크 위치를 열어 줍니까? –

답변

3

내 경험에 의하면. NET은 항상 UNC 경로에 맞았습니다. 때때로 그것은 작동하고 때로는 그렇지 않습니다. 나는 그것에 대한 좋은 설명이있을 것이라고 확신하지만 초기에, 나는 대답을 찾지 않고 수색하고 수색했다.

이 문제를 해결하기보다는 드라이브를 직접 매핑 한 다음 코드 완료시 연결을 끊는 것이 더 나은 방침을 채택했습니다. (답을 찾으면 그 이유를 아는 데 관심이 있지만 작동 솔루션이 있으므로 나 자신을 연구 할만큼 신경 쓰지 않아도됩니다.) 시간당 100 % 효과가 있습니다. 아주 쉽게. 나는 그것을하기위한 수업을 만들었습니다. 왜냐하면 그것은 우리 가게에서 흔히하는 일이기 때문입니다.

아이디어가 마음에 들지는 모르겠지만 관심이 있고 아직 코드를 갖고 있지 않다면 우리 루틴이 아래에 붙여 넣어집니다. 열려있는 드라이브 문자를 확인하고 매핑 한 다음 완료되면 연결을 끊는 것이 매우 간단합니다.

public static class NetworkDrives 
    { 
     public static bool MapDrive(string DriveLetter, string Path, string Username, string Password) 
     { 

      bool ReturnValue = false; 

      if(System.IO.Directory.Exists(DriveLetter + ":\\")) 
      { 
       DisconnectDrive(DriveLetter); 
      } 
      System.Diagnostics.Process p = new System.Diagnostics.Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.RedirectStandardOutput = true; 

      p.StartInfo.FileName = "net.exe"; 
      p.StartInfo.Arguments = " use " + DriveLetter + ": " + Path + " " + Password + " /user:" + Username; 
      p.Start(); 
      p.WaitForExit(); 

      string ErrorMessage = p.StandardError.ReadToEnd(); 
      string OuputMessage = p.StandardOutput.ReadToEnd(); 
      if (ErrorMessage.Length > 0) 
      { 
       throw new Exception("Error:" + ErrorMessage); 
      } 
      else 
      { 
       ReturnValue = true; 
      } 
      return ReturnValue; 
     } 
     public static bool DisconnectDrive(string DriveLetter) 
     { 
      bool ReturnValue = false; 
      System.Diagnostics.Process p = new System.Diagnostics.Process(); 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.RedirectStandardOutput = true; 

      p.StartInfo.FileName = "net.exe"; 
      p.StartInfo.Arguments = " use " + DriveLetter + ": /DELETE"; 
      p.Start(); 
      p.WaitForExit(); 

      string ErrorMessage = p.StandardError.ReadToEnd(); 
      string OuputMessage = p.StandardOutput.ReadToEnd(); 
      if (ErrorMessage.Length > 0) 
      { 
       throw new Exception("Error:" + ErrorMessage); 
      } 
      else 
      { 
       ReturnValue = true; 
      } 
      return ReturnValue; 
     } 

    } 
+0

안녕 데이비드, 솔루션 주셔서 감사합니다. 비슷한 일을 끝냈다. 매핑 된 모든 드라이브를 반복하고 reqd 폴더를 찾으려고합니다.하지만 네트워크 드라이브에 연결하고 연결을 끊을 때문에 정말 솔루션을 좋아해요. . 코드를 재사용해도 괜찮을까요? - Ivar –

+0

제발 ... 제게 독점적 인 내용은 여기에 게시하지 않습니다. – David

1

윈도우 임시 매핑을한다. 간결한 방식으로 .net 앱에서 동일한 작업을 수행 할 수 있는지 확실하지 않습니다. 먼저 드라이브를 문자에 매핑 한 다음 @"Z:\foo\bar\"을 사용하여 액세스 할 수 있습니다. 그러나 앱 매핑이 불가능한 방식으로 드라이브를 배치하려는 경우 드라이브 매핑이 원하지 않을 수도 있습니다.

+0

네, 내 응용 프로그램 자체가 네트워크 드라이브에서 실행되기 때문에 ... 사용자에게 드라이브 문자가 매핑되어 있다고 가정 할 여유가 없습니다. 드라이브 문자가 매핑됩니다 너무 고통 것입니다! : –