Directory.CreateDirectory доступ к пути запрещен?
У меня есть сервер-клиентское приложение, это файловый менеджер
моя проблема в том, что когда я захожу в папку, которая требует контроля доступа, например системных папок, она становится доступной только для чтения, но мне нужно переместить / удалить или создать новую папку, как я могу получить разрешение на это?
вот как я создаю новую папку на стороне сервера
public void NewFolder(string path)
{
try
{
string name = @"\New Folder";
string current = name;
int i = 0;
while (Directory.Exists(path + current))
{
i++;
current = String.Format("{0} {1}", name, i);
}
Directory.CreateDirectory(path + current);
Explore(path); //this line is to refresh the items in the client side after creating the new folder
}
catch (Exception e)
{
sendInfo(e.Message, "error");
}
}
8 ответов
Часто на диске есть каталоги, к которым даже пользователь с правами администратора не может получить доступ. Каталог с таким именем, как "HDDRecovery", скорее всего, будет таким хлопотным. Конечно, он содержит конфиденциальные данные, которые помогают пользователю восстановиться после сбоя диска. Другой каталог, который подходит под эту категорию, это "c:\system volume information", он содержит данные о точках восстановления.
Администратор может изменить разрешения для папок, как это. Но, конечно, это не решает реальную проблему и не является мудрой вещью. Ваш пользователь не может и не должен. Обязательно напишите код, который решает такие проблемы с разрешениями, просто перехватите IOExeption. Избавьте пользователя от неприятностей, никогда не показывая каталог, в котором установлен атрибут Скрытый или Системный. Это атрибуты "не связывайся со мной".
У меня была похожая проблема (asp.net MVC vs2017) с этим кодом:
Directory.CreateDirectory ("~ / Temp");
Вот мое решение:
System.IO.Directory.CreateDirectory (System.Web.HttpContext.Current.Server.MapPath ("~ / temp"));
Если вы хотите удалить атрибут каталога, доступный только для чтения, используйте это: http://social.msdn.microsoft.com/Forums/en/vblanguage/thread/cb75ea00-f9c1-41e5-ac8e-296c302827a4
Если вы хотите получить доступ к системным папкам, вы можете запустить программу от имени локального администратора.
Я также столкнулся с проблемой, похожей на эту, но я смог вручную перемещаться по проводнику Windows и создавать каталоги.
Однако мое веб-приложение, работающее в VS на моем ноутбуке, размещенное через локальный IIS, а не встроенное соглашение IIS для VS, вызывало проблему "Отказано в доступе".
Поэтому, когда я столкнулся с ошибкой в коде, я углубился в поиск дополнительных данных из объекта System.Environment и нашел пользователя, которым, конечно, был пул приложений, под которым мое приложение выполнялось в IIS.
Поэтому я открыл IIS, открыл расширенные настройки для рассматриваемого пула приложений и изменил удостоверение для запуска в сетевой службе. Нажмите ОК. "cmd -> iisreset" для хорошей меры. Попробуйте приложение еще раз, и УСПЕХ!!!!
У меня была такая же проблема при создании каталога. Я использовал DirectorySecurity, как показано ниже:
DirectorySecurity securityRules = new DirectorySecurity();
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\AdminAccount1", FileSystemRights.Read, AccessControlType.Allow));
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\YourAppAllowedGroup", FileSystemRights.FullControl, AccessControlType.Allow));
DirectoryInfo di = Directory.CreateDirectory(path + current, securityRules);
Также помните о безопасности, как объясняется в ответе Ханса Пассанта.
Полную информацию можно найти на MSDN.
Итак, полный код:
public void NewFolder(string path)
{
try
{
string name = @"\New Folder";
string current = name;
int i = 0;
while (Directory.Exists(path + current))
{
i++;
current = String.Format("{0} {1}", name, i);
}
//Directory.CreateDirectory(path + current);
DirectorySecurity securityRules = new DirectorySecurity();
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\AdminAccount1", FileSystemRights.Read, AccessControlType.Allow));
securityRules.AddAccessRule(new FileSystemAccessRule(@"Domain\YourAppAllowedGroup", FileSystemRights.FullControl, AccessControlType.Allow));
DirectoryInfo di = Directory.CreateDirectory(path + current, securityRules);
Explore(path); //this line is to refresh the items in the client side after creating the new folder
}
catch (Exception e)
{
sendInfo(e.Message, "error");
}
}
У меня была такая же ошибка (доступ запрещен) в следующей ситуации:
У меня была следующая структура каталогов:
root/
├─ Nodes.xml/
├─ MyApp.exe
В этой ситуации я попытался создать файл с именем вroot
каталог, и эта операция завершилась неудачей с исключением отказа в доступе , но на самом деле проблема заключалась в том, что существовал каталог с таким же именем.
После удаленияNodes.xml
каталог , проблема исчезла.
Информация об исключениях, безусловно, может быть улучшена.
Решено: каталог, созданный на удаленном сервере с использованием приведенного ниже кода и настроек.
Предоставьте общий доступ к папке и предоставьте права полного доступа также в разделе "Дополнительные настройки" в папке.
DirectoryInfo di = Directory.CreateDirectory(@"\\191.168.01.01\Test\Test1");
Test - это папка назначения, где создается новая папка Test1 (каталог)
Я подозреваю, что когда вы запускаете приложение в режиме клиент / сервер, серверная часть должна быть запущена от имени администратора, в дополнение к возможности удаления только для чтения или системных флагов, чтобы иметь возможность делать то, что вы хотите.
Тем не менее, я согласен с @HansPassant- похоже, что вы пытаетесь сделать, это опрометчиво.