2010-08-06 78 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