Как убедиться, что сетевые диски подключены для приложения?

У меня есть настольное приложение Windows, которое устанавливается в небольших офисных средах.

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

В файлах конфигурации указывается путь .MDB файл на сервере с помощью буквенного диска: например. f:\data\db.mdb

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

Иногда Windows не подключает сетевые диски, и единственный способ подключить их - дважды щелкнуть по ним в "Моем компьютере", даже если при подключении диска установлен флажок "Повторное подключение при входе в систему".

Будет ли решение использовать \\machine_name\share вместо букв дисков?

5 ответов

Решение

Вы спросили: "Будет ли решение использовать \machine_name\share вместо букв дисков?"

Я думаю, да, это может быть. Путь UNC позволяет избежать 2 проблем:

  1. доля не связана с буквой диска
  2. ресурс подключен, но сопоставлен с другой буквой диска, чем вы ожидаете

Неизвестно, делает ли что-либо в вашем приложении путь UNC для MDB, либо усложнение, либо прямое прерывание сделки.

Вы должны использовать UNC-пути, потому что не у всех ваш диск будет привязан к одной и той же букве.

Определить UNC-путь

Во-первых, я бы определил UNC-путь вашего файла, поскольку он существует на вашем локальном компьютере по адресу F:\data\db.mdb используя один из методов, найденных здесь:

По сути, вы смотрите, как Windows Explorer выводит список подключенного сетевого диска, а затем используете его для определения пути UNC.

Проверить наличие с помощью WMI

Предполагая, что диск фактически сопоставлен на каждом локальном компьютере, который планирует использовать приложение, используйте класс Win32_MappedLogicalDisk, чтобы определить доступность подключенного сетевого диска.

У меня есть пример кода, который можно адаптировать, чтобы определить, доступен ли данный сетевой диск (прокрутите вниз до раздела Информация о подключенных дисках). Ты проверяешь .ProviderName чтобы соответствовать пути UNC, чтобы вы знали, какой диск является правильным, то проверьте значение .Availability определить, можно ли получить доступ к подключенному сетевому диску.

Вы определенно должны отказаться от возможностей подключения сетевых дисков:

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

Хотя вы находитесь в домене, я бы не советовал вам использовать имя, поскольку компьютеры по разным причинам не всегда могут найти его "легко" в сети, особенно когда его IP-адрес регулярно меняется.

Вам определенно следует найти способ назначить фиксированный IP-адрес вашему диску: это самое стабильное и постоянное решение, о котором вы только можете подумать. Попросите администратора вашего домена организовать это для вас.

Тестирование наличия вашего сетевого диска может быть сделано очень легко. Существует несколько решений, в том числе попытка открыть файл mdb. Вы также можете проверить существование файла (через файловый объект, я думаю) или даже использовать любую внешнюю программу или Windows API, которые вы можете запустить из своего кода. Пожалуйста, Google 'VB test IP' или что-то подобное, чтобы найти решение в удобное для вас время.

РЕДАКТИРОВАТЬ: Windows даже предлагает имитировать пинг с некоторым кодом VB. Проверьте это здесь

EDIT2: я нашел в одном из моих приложений этот код VBA, который позволяет быстро проверить, существует ли файл (и может ли к нему доступ) где-то в вашей сети. Это было в основном настроено для проверки, доступна ли новая версия пользовательского интерфейса.

Function fileIsAvailable(x_nom As Variant) As Boolean

On Error GoTo ERREUR
Application.Screen.MousePointer = 11

Dim fso as object
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(x_nom) Then
    fileIsAvailable = False
Else
    fileIsAvailable = True
End If
Set fso = Nothing

Application.Screen.MousePointer = 0
On Error GoTo 0
Exit Function

ERREUR:
Application.Screen.MousePointer = 0
debug.print Err.Number, Err.description
End Function 

Вы можете легко вызвать эту функцию, указав сетевое имя вашего файла, например:

if fileIsAvailable("\\192.168.1.110\myFileName.mdb") then ...

Убедитесь, что этот скрипт запущен прямо перед запуском приложения:

net use f: \\machine_name\share /user:[username] [password] /persistent:yes

Это отобразит общий ресурс на указанную вами букву!

Вы не уточнили, для чего написано ваше приложение, однако, прежде чем пытаться подключиться к базе данных в первый раз, предположительно на заставке или что-то в этом роде, проверьте, существует ли f:\data\db.mdb.

Другие вопросы по тегам