如何确保网络驱动器已连接以供应用程序使用?

6
我有一个桌面Windows应用程序,安装在小型办公环境中。该应用程序使用一个.MDB数据库文件作为其数据库,并存储在网络驱动器上。配置文件指定了服务器上.MDB文件的路径,使用一个字母驱动器:例如 f:\data\db.mdb。当应用程序启动时,需要访问这个数据库文件。如何确保应用程序启动时网络驱动器已连接并可访问?有时Windows不会重新连接网络驱动器,即使在映射驱动器时勾选了“登录时重新连接”,唯一的解决方法是在我的电脑中双击它们。将机器名共享\ \ machine_name\share作为解决方案是否可行?

你是在域上还是工作组上?你的网络组件如何分配IP地址?你有没有可能为你的网络驱动器分配一个固定的IP地址?你如何将应用程序分发给用户? - Philippe Grondier
@PhilippeGrondier:这是一个域名。我怀疑IP地址是动态分配的。我能否只使用服务器的机器名称并使用UNC? - CJ7
5个回答

5
你问道,“使用\machine_name\share而不是驱动器字母,这是否是一个解决方案?”
我认为可以。UNC路径避免了两个问题:
1.共享未连接到驱动器字母。
2.共享已连接,但映射到与您预期不同的驱动器字母。
未知的是,您的应用程序是否会使MDB的UNC路径成为一个复杂的问题或者就是不能接受的。

5

你应该使用UNC路径,因为不是每个人都将你的驱动器映射到相同的字母。

确定UNC路径

首先,我会使用这里找到的任一技术来确定您的文件在本地计算机上的UNC路径,例如F:\data\db.mdb

基本上,你要查看Windows资源管理器如何列出网络映射驱动器,然后使用这个信息推断出UNC路径。

使用WMI检查可用性

假设驱动器实际上在每台计划使用应用程序的本地计算机上都被映射,请使用Win32_MappedLogicalDisk类来确定映射的网络驱动器的可用性。

我有一些示例代码在这里,可以被改编用来确定给定网络驱动器是否可用(向下滚动到Mapped Drives Information部分)。您可以检查.ProviderName来匹配UNC路径,以便了解哪个是正确的驱动器,然后检查.Availability的值以确定是否可以访问映射的网络驱动器。

以上链接已失效。 - Sterno
1
如果网络驱动器未连接,则不会在Win32_MappedLogicalDisk中显示! - casiosmu

1

你应该放弃网络驱动器映射的可能性:

  • 使用这种技术会强制你在每台使用你的数据库的计算机上'物理地'操作,需要为网络驱动器分配一个字母。
  • 每个计算机用户都可以轻松更改它
  • 任何与网络的断开连接都可能强制用户“手动”重新连接到磁盘驱动器

尽管你在域上,我不建议你使用名称,因为由于多种原因,计算机在网络上可能不总是能够轻松找到它,特别是当它的IP定期更改时。

你应该找到一种为你的磁盘分配固定IP的方法:这是你可以考虑的最稳定和永久的解决方案。请向你的域管理员提出请求。

测试网络磁盘的存在非常容易。有多种解决方案,包括直接尝试打开mdb文件。你也可以通过文件对象(我想)测试文件的存在,甚至可以使用从代码中启动的任何外部程序或Windows API。请谷歌“VB test IP”或类似内容,以找到适合你的解决方案。

编辑:Windows 甚至有一个用一些 VB 代码模拟 PING 的建议。 在这里查看

编辑2:我在我的其中一个应用程序中找到了这个 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 ...

你如何为磁盘分配IP地址? - CJ7
我理解你的磁盘是一个网络磁盘,通过以太网连接到网络,并具有MAC地址。在这种情况下,您可以在路由器级别声明磁盘MAC地址必须与特定IP关联。因此,每次磁盘连接到网络时,都会分配相同的IP地址。 - Philippe Grondier
它是映射到驱动器号的网络共享。它不能被分配一个IP。IP只能被分配给网络设备。 - CJ7
“该应用程序使用.MDB数据库文件作为其数据库,该文件存储在网络驱动器上。”所以你没有说它是一个网络共享...无论如何,如果它是一个网络共享,为什么不通过完整名称 '\computername\foldername\filename.mdb' 访问它呢? - Philippe Grondier

0

您没有明确说明您的应用程序是用什么语言编写的,但在您尝试首次连接到数据库之前,可能是在闪屏或类似的界面中,请检查 f:\data\db.mdb 是否存在。


0
请确保在启动应用程序之前运行此脚本:
net use f: \\machine_name\share /user:[username] [password] /persistent:yes

这将映射您指定的字母的共享驱动器!


这并不能确保网络驱动器已连接并可访问,是吗? - Philippe Grondier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接