对目录的附加和写入权限 - FileIOPermission给出不好的结果?

时间:2014-02-07 09:00:49

标签: c# .net file-permissions directoryinfo

我有一个问题实际上已经解决了,但我完全不明白为什么它会像这样。

所以我有一个网络共享,我想简单地验证我是否有权在该共享中创建新文件和目录。我用了两种方法来解决这个问题,但两者都得到了不同的结果。我的测试用例是我无法在该共享上创建文件和目录:

尝试创建新目录 - 不是一个好方法

try
{
    var testPath = Path.Combine(path, testDirectory)
    Directory.CreateDirectory(testPath)
}
catch
{
    // No access
}

这是一种我根本不喜欢的方式,但它有效...我在这里有一个例外,所以它正确地说我没有特定路径的许可。

使用FileIOPermission - 更好的方式

try
{
    var writePermission = new FileIOPermission(FileIOPermissionAccess.Write, path)
    var appendPermission = new FileIOPermission(FileIOPermissionAccess.Append, path)
    writePermission.Demand()
    appendPermission.Demand()
}
catch
{
    // No access
}

通过这种方法,我没有任何异常,所以它告诉我,我有权创建新文件 - 实际上并非如此。

任何人都知道第二种方法有什么问题?

2 个答案:

答案 0 :(得分:0)

FileIOPermission不检查文件/目录的实际权限。它更像是“如果我不必担心ACL,我能不能访问它?”检查。

查看this post以了解FileIOPermission实际上在做什么。

然后,查看this post以了解如何查询实际的文件系统ACL以查看是否可以读/写文件。

答案 1 :(得分:0)

如果你想要简单,易于维护和易懂的代码,那么进行文件系统操作没有比尝试做你想要的更好的方法和处理你期望的异常,例如UnauthorizedAccessException。

通过显式处理UnauthorizedAccessException并忽略其余部分,您可以执行回退逻辑,以便在发生这种情况时,异常将冒泡并且可能无法处理导致应用程序停止(示例1)。您的示例2似乎打破了.NET运行时联系以了解如何处理运行时错误。

.NET和托管运行时期望您相应地使用和处理异常。见http://msdn.microsoft.com/en-us/library/8ey5ey87%28v=vs.91%29.aspx

我希望这可以帮助你解决一些问题。