3

我在我的 winform 中使用 folderBrowserDialog。

我需要默认或初始路径作为网络位置。

例如:

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

这不起作用。我的系统在正确的网络上,我可以通过浏览器访问该目录并运行命令。

这是非功能吗?还是有解决方法?如果有人可以指导我,我将不胜感激!

谢谢,伊瓦尔

4

2 回答 2

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;
        }

    }
于 2010-08-07T05:45:47.617 回答
1

\\name当您使用约定访问网络资源时,Windows 会进行临时映射。我不确定是否有规定以简洁的方式从 .net 应用程序中执行相同的操作。您可能希望首先将驱动器映射到一个字母,然后使用它来访问它,@"Z:\foo\bar\"但显然,如果您的应用程序以阻止它的方式部署,则映射驱动器可能不是您想要做的事情。

于 2010-08-06T23:29:50.347 回答