我想快速检查文件共享是否在C#中可用,但不知道网络共享上可能存在的目录。我发现这些帖子1 2 3显示了如何检查网络目录是否可用,但他们都假设我知道我想检查的目录共享是否存在。也就是说,他们想检查 \\ SomeServer \ SomeDirectory 是否可用,但我只是想检查 \\ SomeServer 是否可用。
关于我正在尝试做的更多细节,我提示用户连接一个SQL服务器,他们给我一个地址,如“SQL001”;显然这个地址仅在我们的内部网络上有效。有了这个地址,我就能连接到服务器及其数据库。现在,我给他们提供备份数据库的选项,并希望OpenFileDialog将InitialDirectory设置为“\\ SQL001”,以便他们可以快速访问该服务器上的共享文件夹并将数据库备份到远程数据库上服务器
如果我将“\\ SQL001”设置为OpenFileDialog的InitialDirectory,一切正常,但是如果他们输入错误并输入“\\ SQL002”(不存在),或者在内部关闭时尝试使用该工具网络,然后OpenFileDialog的ShowDialog函数抛出一个错误。所以我想检查并确保文件共享首先可用,如果没有,我将不会设置InitialDirectory。
使用 Directory.Exists(“\\ SQL001”)总是会丢失错误。如果我 Directory.Exists(“\\ SQL001 \ Backups”)它可以工作,但我们有许多不同的SQL服务器,并且它们并不都有一个名为“备份”的共享,所以这不是可靠。我也可以使用 Directory.Exists(“\\ SQL001 \ c $ \”)这对我有用,但很多员工都没有权限到根C:\,但是会有权限网络共享,所以这也不是一个好的选择。
所以我的问题是,假设用户拥有文件共享权限,我该如何检查文件共享是否可用?另外,我也不想强迫用户map "\\SQL001" as a network drive。
我现在能看到的唯一解决方案是只调用OpenFileDialog的ShowDialog函数并捕获特定的异常,清除InitialDirectory然后再次调用ShowDialog。它会工作,但感觉有点hacky,所以我希望有一个更好的解决方案。
答案 0 :(得分:7)
有效的UNC路径必须至少包含两个组件; \ SERVERNAME \ SHARE;如果不满足条件,Directory.Exists将返回false。
要确定SERVERNAME标识的计算机是否存在,您可以使用GetHostByName
http://msdn.microsoft.com/en-us/library/system.net.dns.gethostbyname.aspx
但是仍然不会告诉你机器是否停机。
答案 1 :(得分:2)
根据Allan Elder的回应,我想出了以下似乎有效的解决方案。我使用了 System.Net.Dns.GetHostEntry()而不是GetHostByName,因为现在不推荐使用GetHostByName。
/// <summary>
/// Gets the rooted path to use to access the host.
/// Returns an empty string if the server is unavailable.
/// </summary>
/// <param name="serverName">The server to connect to.</param>
public static string GetNetworkPathFromServerName(string serverName)
{
// Assume we can't connect to the server to start with.
var networkPath = String.Empty;
// If this is a rooted path, just make sure it is available.
if (Path.IsPathRooted(serverName))
{
// If the path exists, use it.
if (Directory.Exists(serverName))
networkPath = serverName;
}
// Else this is a network path.
else
{
// If the server name has a backslash in it, remove the backslash and everything after it.
serverName = serverName.Trim(@"\".ToCharArray());
if (serverName.Contains(@"\"))
serverName = serverName.Remove(serverName.IndexOf(@"\", StringComparison.Ordinal));
try
{
// If the server is available, format the network path properly to use it.
if (Dns.GetHostEntry(serverName) != null)
{
// Root the path as a network path (i.e. add \\ to the front of it).
networkPath = String.Format("\\\\{0}", serverName);
}
}
// Eat any Host Not Found exceptions for if we can't connect to the server.
catch (System.Net.Sockets.SocketException)
{ }
}
return networkPath;
}
答案 2 :(得分:0)
如果您打算使用Windows文件共享,有效的方法是打开一个套接字到 NetBIOS端口(139),用于文件共享服务。这不仅会告诉您服务器是否在线,还是它是否可用于文件操作。 Complete .net source code is here.