Доступ к папке запрещен

Раньше у меня была эта проблема, но я всегда могу ее исправить, перейдя на вкладку "Безопасность" в свойствах, затем "Дополнительно", а затем в конце концов добавлю "Админ" в список разрешений доступа. Но в этом случае у меня фактически есть приложение Windows Forms, в котором я использую этот код:

FileStream config = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); 

в C#.

Все это прекрасно работало внутри Visual Studio, но как только я собрал проект, установил программу на свой компьютер и запустил ее, он создал эту папку.

Почему-то я не могу получить разрешение обычным способом. Это просто дает мне сообщение: "У вас нет разрешения на просмотр или редактирование настроек разрешений этого объекта". Я не знаю почему. Может кто-нибудь подскажите, пожалуйста, как получить разрешение или сразу удалить папку? И что пошло не так в моей программе и вызвало это?

2 ответа

Вы всегда можете взять на себя ответственность, если у вас есть необходимый доступ администратора. После того, как вы вступите во владение, вам придется закрыть окна свойств, а затем, когда вы вернетесь назад, вы сможете изменить разрешения. Я не могу говорить об изменениях в вашем коде, но держу пари, что у вас нет "владельца" папки.

Вам также нужно позвонить SetAccessControl применить изменения.

ds = di.GetAccessControl();
ds.AddAccessRule(fsar);
di.SetAccessControl(ds); // nothing happens until you do this

Кажется, что примеры на MSDN очень не хватает в деталях, как обсуждалось здесь. Я взломал код из этой статьи, чтобы получить следующее, которое ведет себя хорошо:

static bool SetAcl()
{
    FileSystemRights Rights = (FileSystemRights)0;
    Rights = FileSystemRights.FullControl;

    // *** Add Access Rule to the actual directory itself
    FileSystemAccessRule AccessRule = new FileSystemAccessRule("Users", Rights,
                                InheritanceFlags.None,
                                PropagationFlags.NoPropagateInherit,
                                AccessControlType.Allow);

    DirectoryInfo Info = new DirectoryInfo(destinationDirectory);
    DirectorySecurity Security = Info.GetAccessControl(AccessControlSections.Access);

    bool Result = false;
    Security.ModifyAccessRule(AccessControlModification.Set, AccessRule, out Result);

    if (!Result)
        return false;

    // *** Always allow objects to inherit on a directory
    InheritanceFlags iFlags = InheritanceFlags.ObjectInherit;
    iFlags = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit;

    // *** Add Access rule for the inheritance
    AccessRule = new FileSystemAccessRule("Users", Rights,
                                iFlags,
                                PropagationFlags.InheritOnly,
                                AccessControlType.Allow);
    Result = false;
    Security.ModifyAccessRule(AccessControlModification.Add, AccessRule, out Result);

    if (!Result)
        return false;

    Info.SetAccessControl(Security);

    return true;
}
Другие вопросы по тегам