我正在开发一个胖客户端应用程序,该应用程序经常遇到访问网络共享的“问题”。在对服务器进行任何 IO 之前,我的应用程序会测试共享(通常采用 \\server\share$ 形式)是否存在。这对于检测客户端与服务器失去连接的情况非常有效,但仍然存在一些奇怪的情况,其中存在隐藏共享,但用户无权从共享内读取内容。有人可以分享(没有双关语)测试当前用户是否可以读取共享上的文件所需的 C# 代码吗?我应该查询共享的 ACL 或共享中的文件吗?如果共享为空怎么办?如果用户是混合环境中的本地非管理员(XP Pro 工作站、Novell 网络上没有域的 Windows 2003 服务器)怎么办?
最简单的方法就是这样做(例如,尝试读取文件)。正如 Jared 提到的,没有办法确保您将来能够阅读(网络故障、权限更改等)。
就代码而言,您可以使用目录信息 http://msdn.microsoft.com/en-us/library/system.io.directoryinfo.aspx类尝试一些答案:
string remotePath = @"\\server\share$";
bool haveAccess = false;
DirectoryInfo di = new DirectoryInfo(remotePath);
if (di.Exists)
{
try
{
// you could also call GetDirectories or GetFiles
// to test them individually
// this will throw an exception if you don't have
// rights to the directory, though
var acl = di.GetAccessControl();
haveAccess = true;
}
catch (UnauthorizedAccessException uae)
{
if (uae.Message.Contains("read-only"))
{
// seems like it is just read-only
haveAccess = true;
}
// no access, sorry
// do something else...
}
}
上面的代码有很多缺点(例如硬编码的“只读”测试),但这只是一个示例,用于说明您可以做什么。 DirectoryInfo 还有一些其他帮助程序方法,可用于列出文件夹中的文件。如果您无权访问,这些方法将抛出一个UnauthorizedAccessException
您可以使用该异常来测试访问失败的原因。查看有关的信息获取访问控制 http://msdn.microsoft.com/en-us/library/t1h6d4k4.aspx有关它抛出的异常的更多详细信息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)