假设我在闪亮的服务器上有一个共享:
\\server1\MyShare
如果我运行这个:
Directory.Exists("\\server1\MyShare") //Returns True
现在我将电缆从服务器中拔出并再次运行代码:
Directory.Exists("\\server1\MyShare") //Returns False
我想知道它是否返回false,因为......:
- 服务器无法访问
- 服务器有响应,但目录不存在
实现这一目标的最简单方法是什么?
假设我在闪亮的服务器上有一个共享:
\\server1\MyShare
如果我运行这个:
Directory.Exists("\\server1\MyShare") //Returns True
现在我将电缆从服务器中拔出并再次运行代码:
Directory.Exists("\\server1\MyShare") //Returns False
我想知道它是否返回false,因为......:
实现这一目标的最简单方法是什么?
检查是否可以 ping 服务器
ping 服务器:http: //msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx
一个阻塞的例子:
Ping ping = new Ping();
PingResponse response = ping.PingHost(@"\\server1", 4);
我有一个类似的问题,但由于我所追求的目录是一个额外的层(\\Server\Share\Directory)我能够用一个简单的作弊;
if( Directory.Exists("\\Server\Share") && !Directory.Exists("\\Server\Share\Directory") )
//Server is up, directory doesn't exist
..etc..
有一个潜在的时间/竞争条件,但它还没有给我带来任何问题。
这些答案将帮助您解决问题的 a) 部分 - 我如何检查远程服务器是否响应:C# Check Remote Server
至于 b 部分),您的Directory.Exists方法是最好的方法 - 但是您可能想考虑使用 WMI 来检查文件夹,但这比使用您已有的方法要慢得多且麻烦。
Ping 有点笨拙,根据您的网络设置方式,可能不允许 Ping,或者其他设备可能会响应 Ping。
此代码将根据您尝试访问的文件夹的状态将三个消息之一写入控制台:
try
{
DirectoryInfo diNoServer = new DirectoryInfo(@"\\non.existant.server\share");
diNoServer.Attributes = diNoServer.Attributes;
if (!diNoServer.Exists)
{
Console.WriteLine("The server was responsive, but the directory did not exist");
}
else
{
Console.WriteLine("all good");
}
}
catch (IOException exception)
{
Console.WriteLine("The server was unreachable");
}
通常,如果无法访问共享,则说明出现问题并且应该停止处理。
如果由于某种原因(网络故障、服务器故障、禁止访问等)无法访问共享,我使用以下扩展程序抛出异常
public static class DirectoryExtension
{
public static bool IsShareAccessible(String unc)
{
if (Path.IsPathRooted(unc))
{
var share = Path.GetPathRoot(unc);
return Directory.Exists(share);
}
return true; //true is is not unc or full local path
}
}
如何使用它:
if (!Directory.IsShareAccessible(@"\\server\share\folder"))
Throw new ApplicationException("can't access share");
if (!Directory.Exists(@"\\server\share\folder") {
...