Папкабраузердиалог на С# winforms

Я использую folderBrowserDialog в своей winform.

Мне нужно, чтобы путь по умолчанию или начальный путь был сетевым расположением.

например:

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

Это не работает. Моя система находится в нужной сети, и я могу получить доступ к каталогу через браузер и выполнить команду.

Это не функция? или есть обходной путь? Я был бы признателен, если бы кто-то мог направить меня через!

Спасибо, Ивар


person topgun_ivard    schedule 06.08.2010    source источник
comment
Получаете ли вы какие-либо (интересные) исключения, возникающие при выполнении кода?   -  person cristobalito    schedule 07.08.2010
comment
Я проверил это на своем компьютере (WinXP SP3, Visual C# Express 2008), и все работает нормально. Не могли бы вы рассказать подробнее о неудаче. Что вы увидели, когда попробовали? Какую ОС и C# вы используете?   -  person sidewinderguy    schedule 07.08.2010
comment
@cristobalito: это не вызывает никаких исключений, оно просто переходит в представление базовой папки (Мой компьютер). @sidewinderguy: то же самое! Я использую Visual C # Professional Edition 2008 на Win XP SP3 ... так что ShowDialog открывает сетевое расположение по умолчанию?   -  person topgun_ivard    schedule 07.08.2010
comment
Боже, я ненавижу диалог просмотра папок... /rant   -  person Ed S.    schedule 07.08.2010


Ответы (2)


По моему опыту, в .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;
        }

    }
person David    schedule 07.08.2010
comment
Эй, Дэвид, спасибо за решение. В итоге я сделал что-то подобное. Я перебираю все подключенные диски и пытаюсь найти папку reqd. Но мне очень нравится ваше решение, так как оно подключается и отключается от сетевого диска. Вы не возражаете, если я воспользуюсь вашим кодом? - Ивар - person topgun_ivard; 14.08.2010
comment
Пожалуйста... Я не размещаю здесь ничего, что является собственностью. - person David; 14.08.2010

Windows создает временное сопоставление при доступе к сетевому ресурсу с использованием соглашения \\name. Я не уверен, есть ли возможность сделать то же самое из приложения .net в сжатой форме. Возможно, вы захотите сначала сопоставить диск с буквой, а затем получить к нему доступ с помощью @"Z:\foo\bar\", но, очевидно, сопоставление диска может быть не тем, что вы хотите делать, если ваше приложение развернуто таким образом, что это предотвращает.

person JYelton    schedule 06.08.2010
comment
Да, поскольку само мое приложение запускается с сетевого диска... я не могу позволить себе предположить, что у пользователя есть сопоставленная буква диска... и выяснить, какая буква диска сопоставлена, тоже будет больно! :( - person topgun_ivard; 07.08.2010