2010-08-06 93 views
3

我在我的winform中使用了folderBrowserDialog。C#winforms上的folderbrowserdialog

我需要默認或初始路徑爲網絡位置。

爲如:

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

這是行不通的。我的系統位於正確的網絡上,我可以通過瀏覽器訪問目錄並運行命令。

這是非功能嗎?還是有解決辦法? 如果有人能指導我通過,我將不勝感激!

感謝, 伊瓦

+0

當您逐步執行代碼時,是否會引發任何(有趣)異常? – cristobalito 2010-08-06 23:36:53

+2

我在我的電腦上測試了這個(WinXP SP3,Visual C#Express 2008),它工作正常。你能否提供關於失敗的更多細節當你嘗試時,你看到了什麼?你正在使用哪種操作系統和C#? – sidewinderguy 2010-08-06 23:41:57

+0

@cristobalito:這不會拋出任何異常,它只是去基礎文件夾(「我的電腦」)視圖。 @sidewinderguy:同樣捏!我在Win XP SP3上使用Visual C#Professional Edition 2008 ... ShowDialog默認打開網絡位置? – 2010-08-06 23:46:36

回答

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 – 2010-08-13 22:12:59

+0

請不要在這裏發佈任何專有的東西。 – David 2010-08-13 22:16:53

1

的Windows使一個臨時映射當您訪問使用\\name約定的網絡資源。我不確定是否有條款從簡潔的方式從.net應用程序執行相同的操作。您可能需要先將驅動器映射到一個字母,然後使用@"Z:\foo\bar\"訪問該驅動器,但顯然,如果您的應用以防止該驅動器的方式進行部署,映射驅動器可能不是您想要執行的操作。

+0

是的,因爲我的應用程序本身從網絡驅動器運行...我不能假設用戶有映射的驅動器號......並找出哪個盤符映射將是一個痛苦呢! :( – 2010-08-06 23:48:25