检查服务器路径是否可用作C#中的文件共享

dea*_*dog 3 .net c# share exists unc

我想快速检查文件共享是否在C#中可用,但不知道网络共享上可能存在的目录.我发现这些帖子1 2 3显示了如何检查网络目录是否可用,但他们都假设我知道我想检查的目录共享是否存在.也就是说,他们想要检查\\ SomeServer\SomeDirectory是否可用,但我只是想检查是否有\\ SomeServer可用.

有关我正在尝试做什么的更多细节,我提示用户连接一个SQL服务器,他们给我一个地址,如"SQL001"; 显然这个地址仅在我们的内部网络上有效.有了这个地址,我就能连接到服务器及其数据库.现在,我给他们提供备份数据库的选项,并希望OpenFileDialog将InitialDirectory设置为"\\ SQL001",以便他们可以快速访问该服务器上的共享文件夹并在远程服务器上备份数据库.

如果我将"\\ SQL001"设置为OpenFileDialog的InitialDirectory,一切正常,但如果输入错误并输入"\\ SQL002"(不存在),或者在内部网络关闭时尝试使用该工具,那么OpenFileDialog的ShowDialog函数抛出一个错误.所以我想检查并确保文件共享首先可用,如果没有,我将不会设置InitialDirectory.

不幸的是,使用Directory.Exists("\\ SQL001")总是返回false.如果我使用Directory.Exists("\\ SQL001\Backups")它可以工作,但我们有许多不同的SQL服务器,并且它们并不都有一个名为"备份"的共享,因此这是不可靠的.我也可以使用适用于我的Directory.Exists("\\ SQL001\c $ \"),但许多员工不会拥有根C:\的权限,但会拥有网络共享的权限,所以不是一个很好的选择.

所以我的问题是,假设用户拥有文件共享权限,我该如何检查文件共享是否可用?另外,我不想强​​迫用户将"\\ SQL001"映射为网络驱动器.

我现在能看到的唯一解决方案是只调用OpenFileDialog的ShowDialog函数并捕获特定的异常,清除InitialDirectory然后再次调用ShowDialog.它会工作,但感觉有点hacky,所以我希望有一个更好的解决方案.

All*_*der 7

有效的UNC路径必须至少包含两个组件;\SERVERNAME\SHARE; 如果不满足该条件,Directory.Exists将返回false.

要确定SERVERNAME标识的计算机是否存在,可以使用GetHostByName

http://msdn.microsoft.com/en-us/library/system.net.dns.gethostbyname.aspx

但是,仍然不会告诉你机器是否停机.