c# - 检查 .NET 中的目录和文件写入权限

标签 c# .net winforms directory file-permissions

在我的 .NET 2.0 应用程序中,我需要检查是否存在足够的权限来创建文件并将文件写入目录。为此,我有以下函数尝试创建一个文件并向其写入一个字节,然后删除自身以测试是否存在权限。

我认为最好的检查方法是实际尝试并捕获发生的任何异常。不过,我对一般的异常捕获不是特别满意,那么有没有更好的或者更容易接受的方法呢?

private const string TEMP_FILE = "\\tempFile.tmp";

/// <summary>
/// Checks the ability to create and write to a file in the supplied directory.
/// </summary>
/// <param name="directory">String representing the directory path to check.</param>
/// <returns>True if successful; otherwise false.</returns>
private static bool CheckDirectoryAccess(string directory)
{
    bool success = false;
    string fullPath = directory + TEMP_FILE;

    if (Directory.Exists(directory))
    {
        try
        {
            using (FileStream fs = new FileStream(fullPath, FileMode.CreateNew, 
                                                            FileAccess.Write))
            {
                fs.WriteByte(0xff);
            }

            if (File.Exists(fullPath))
            {
                File.Delete(fullPath);
                success = true;
            }
        }
        catch (Exception)
        {
            success = false;
        }
    }

最佳答案

Directory.GetAccessControl(path) 完成您的要求。

public static bool HasWritePermissionOnDir(string path)
{
    var writeAllow = false;
    var writeDeny = false;
    var accessControlList = Directory.GetAccessControl(path);
    if (accessControlList == null)
        return false;
    var accessRules = accessControlList.GetAccessRules(true, true, 
                                typeof(System.Security.Principal.SecurityIdentifier));
    if (accessRules ==null)
        return false;

    foreach (FileSystemAccessRule rule in accessRules)
    {
        if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write) 
            continue;

        if (rule.AccessControlType == AccessControlType.Allow)
            writeAllow = true;
        else if (rule.AccessControlType == AccessControlType.Deny)
            writeDeny = true;
    }

    return writeAllow && !writeDeny;
}

(FileSystemRights.Write & rights) == FileSystemRights.Write 正在使用一种叫做“Flags”的东西,顺便说一句,如果你不知道它是什么,你应该仔细阅读 :)

关于c# - 检查 .NET 中的目录和文件写入权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1281620/

相关文章:

.net - 针对同一 VS2012 项目中的 x86 和 x64 程序集;引用

.net - 通过具有文化意识的首字母对字符串进行分组

c# - 如何在 C# 中使用低级键盘钩子(Hook)来抑制任务切换键(winkey、alt-tab、alt-esc、ctrl-esc)

c# - 将大型 vb6 应用程序移至 Web 或 winform。你决定!

c# - 在 PNG 中将 16 位灰度映射到 8 位

c# - MVC3 : How to check recaptcha with Ajax or directly with JS?

c# - 搜索 List<List<string>> 的最佳方法是什么?

c# - 如何使事件回调进入我的 win 表单线程安全?

c# - 如何将 List<> 绑定(bind)到 ListView 中的列

c# - c# vs2015 中的 c++ dll xml 文档注释