Приложение говорит, что сетевой диск не существует, но найден с использованием OpenFileDialog

Я сделал небольшое приложение, которое работает на Win7-PC. Все, что нужно, - проверить содержимое сетевого диска в час ночи (и сравнить его с папкой на локальном жестком диске), а если есть различия, скопируйте отличия в эту папку.

Проблема в том, что иногда он не может найти сетевой диск.

Когда приложение запустится, сетевой диск будет найден с помощью кнопки в приложении, которая запустит OpenFileDialog, и полученная буква диска будет помещена в текстовое поле рядом с кнопкой. С этого момента он должен просто работать сам по себе. ПК никогда не отключается.

Когда говорится, что сетевой диск не найден, я могу вручную нажать кнопку в том же приложении, выбрать диск в OpenFileDialog (буква диска никогда не изменяется), и приложение будет безупречно работать в течение нескольких дней. Затем проблема возникает снова.

Вопрос: почему доступ к сетевому диску через OpenFileDialog в моем приложении, но мое приложение не может?

Мое приложение запускает процесс копирования, используя эту функцию (называемую "Y: \" ), чтобы определить, присутствует ли диск или нет:

    public bool fn_drive_exists(string par_string)
    {
        DirectoryInfo di_dir = new DirectoryInfo(par_string);
        if (di_dir.Exists)
        {
            return true;
        }

        return false;
    }

... и иногда он возвращает False, пока я не "разбужу его", используя OpenFileDialog.

Что делает OpenFileDialog, что у моего приложения нет?

Ответ 1

В соответствии с этим SO post проблема должна исчезнуть, если вы используете UNC-путь, а не подключенный сетевой диск.

Ответ 2

Если ваш пункт назначения имеет статический IP-адрес, я предлагаю вам использовать этот IP-адрес вместо имени домена для сетевого диска

Ответ 3

Это сообщение SO описывает аналогичный сценарий того, что вы описали.

Одна из ссылок, размещенных в качестве ответа на этот вопрос, привела меня к этой статье MSDN, которая содержит множество причин, по которым один могут столкнуться с ошибками при попытке доступа к общим сетевым дискам с помощью сопоставленной буквы диска.

Предложение Microsoft (см. ниже) - просто использовать UNC-путь.

Служба (или любой процесс, выполняющийся в другом контексте безопасности), который должен получить доступ к удаленному ресурсу, должен использовать имя Universal Naming Convention (UNC) для доступа к ресурсу.

Чтобы ответить на ваш конкретный вопрос более конкретно, в отношении того, почему он внезапно не может получить доступ к сетевому ресурсу, я бы рискнул предположить, что сетевой ресурс отключается Windows из-за тайм-аута простоя, как обсуждалось в KB297684. Любая попытка получить доступ к отключенному диску будет выполнена с небольшим ожиданием, когда соединение с сетевым ресурсом будет восстановлено, что, вероятно, может быть причиной вашей проблемы.

Чтобы проверить эту теорию, попробуйте записать некоторые данные в файл на сетевом диске с относительно небольшим интервалом (каждые 10 минут, возможно?), чтобы попытаться убедить Windows, что диск все еще активен.

Ответ 4

Вы также можете попробовать:

System.IO.Directory.Exists(par_string);

вместо того, чтобы писать собственный метод для одного и того же. Я ожидал, что метод framework сможет "разбудить" сетевой диск. Примечание. Метод также работает для UNC-путей (что-то вроде \\<server name or IP address>\<shared folder>)

Ответ 5

Как говорит Харви, используйте UNC-путь для доступа к папке, например \\server\sharedfolder. Вместо\\сервера используйте имя сервера. У вашего компьютера есть имя, а также сервер. Вы также можете использовать IP-адрес, если знаете. Вы заменяете \sharedfolder путь к файлам. Некоторые примеры:

\\ AppsServer\c $\ Program Files (x86)

\\ FileServer1\d $\ Users\John\Мои документы

C $означает, что диск C является общей папкой. Если весь диск не используется совместно, вам необходимо предоставить общий доступ к определенной папке. Вы можете сделать это, войдя на сервер, щелкнув правой кнопкой мыши папку и выбрав "Свойства". Затем перейдите на вкладку "Общий доступ" и установите флажок "Поделиться этой папкой". Если ваша общая папка называется MyShare, то ваш UNC-путь для доступа к папке будет

\\ сервер\MyShare