Как обеспечить подключение сетевых дисков для приложения? - PullRequest
5 голосов
/ 16 января 2012

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

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 24 января 2012

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

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

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

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

Проверка доступности с помощью WMI

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

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

3 голосов
/ 19 января 2012

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

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

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

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

1 голос
/ 20 января 2012

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

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

Хотя вы включеныдомен, я бы не советовал вам использовать имя, так как компьютеры по разным причинам не всегда могут найти его «легко» в сети, особенно когда его 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 ...
0 голосов
/ 24 января 2012

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

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

Это сопоставит общий диск с указанной вами буквой!

0 голосов
/ 17 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...