Как убедиться, что сетевые диски подключены для приложения?
У меня есть настольное приложение Windows, которое устанавливается в небольших офисных средах.
Приложение использует .MDB
файл базы данных в качестве базы данных, который хранится на сетевом диске.
В файлах конфигурации указывается путь .MDB
файл на сервере с помощью буквенного диска: например. f:\data\db.mdb
При запуске приложению необходим доступ к этому файлу базы данных. Как я могу убедиться, что сетевой диск подключен и доступен при запуске приложения?
Иногда Windows не подключает сетевые диски, и единственный способ подключить их - дважды щелкнуть по ним в "Моем компьютере", даже если при подключении диска установлен флажок "Повторное подключение при входе в систему".
Будет ли решение использовать \\machine_name\share
вместо букв дисков?
5 ответов
Вы спросили: "Будет ли решение использовать \machine_name\share вместо букв дисков?"
Я думаю, да, это может быть. Путь UNC позволяет избежать 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.