Почему доступ к пути запрещен?
У меня проблема с удалением файла, но я получаю исключение.
if (result == "Success")
{
if (FileUpload.HasFile)
{
try
{
File.Delete(Request.PhysicalApplicationPath + app_settings.login_images + txtUploadStatus.Text);
string filename = Path.GetFileName(btnFileUpload.FileName);
btnFileUpload.SaveAs(Request.PhysicalApplicationPath + app_settings.login_images + filename);
}
catch (Exception ex)
{
Message(ex.ToString());
}
}
}
Также я должен отметить, что папка, из которой я пытаюсь удалить, полностью контролирует сетевые сервисы.
Полное сообщение об исключении:
System.UnauthorizedAccessException: доступ к пути 'C:\Users\gowdyn\Documents\Visual Studio 2008\Projects\hybrid\hybrid\temp_loginimages\enviromental.jpg' запрещен. в System.IO.__Error.WinIOError(Int32 errorCode, String MaybeFullPath) в System.IO.File.Delete(String path) в hybrid.User_Controls.Imgloader_Add_Edit_Tbl.btnUpdate_Click(Отправитель объекта, EventArgs e) в C: \ Users \ Users Документы \ Visual Studio 2008 \ Проекты \hybrid\hybrid\User_Controls\Imgloader_Add_Edit_Tbl.ascx.cs: строка 242
Есть идеи?
33 ответа
По методу File.Delete...
UnauthorizedAccessException
означает одну из 4 вещей:
- Звонящий не имеет необходимого разрешения.
- Файл является исполняемым файлом, который используется.
- Путь это каталог.
- Путь указан файл только для чтения.
У меня тоже была проблема, поэтому я споткнулся в этом посте. Я добавил следующую строку кода до и после копирования / удаления.
удалять
File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);
копия
File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);
Это старая проблема, но я столкнулся с ней во время поиска. Оказывается, я пропустил фактический компонент имени файла в пути сохранения для SaveAs...
string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD
Когда пользователь пытается подключиться к вашему веб-сайту, IIS назначает подключение учетной записи IUSER_ComputerName, где ComputerName - это имя сервера, на котором работает IIS. По умолчанию учетная запись IUSER_ComputerName является членом группы "Гости". Эта группа имеет ограничения безопасности. Попробуйте получить доступ к IUSER_ComputerName к этой папке
Здесь очень хорошо описан ответ о безопасности IIS
Надеюсь это поможет
Я получил ошибку, потому что я не понимал, что местом назначения должен быть файл. У меня была папка как второй параметр (который работает в cmd). и я получил Unhandled Exception: System.UnauthorizedAccessException: Access to the path is denied.
потому что C# File.Move
там нужен файл, не только для первого параметра, но и для второго, и поэтому, если вы указываете каталог в качестве второго параметра, он пытается записать файл как c:\crp
когда у вас есть каталог с именем c:\crp
,
это было бы неправильно File.Move(args[0],"c:\\crp");
Итак, это было бы правильно File.Move(args[0],"c:\\crp\\a.a");
То же самое касается File.Copy
Щелкните правой кнопкой мыши Visual Studio и выберите Запуск от имени администратора.
Если это веб-сайт IIS, в котором возникла проблема, проверьте свойство Identity дополнительных параметров для пула приложений, который используется сайтом или приложением. Вы можете обнаружить, что для него установлено значение ApplicationPoolIdentity, и в этом случае именно этот пользователь должен будет иметь доступ к пути.
Или вы можете пойти по старому стилю и просто установить для Identity значение Network Service и предоставить пользователю Network Service доступ к пути.
Та же проблема для меня, я указывал папку, а не файл.
поэтому убедитесь, что в пути, укажите путь + имя файла
System.IO.File.WriteAllBytes("path", bytearray);
Вам нужно изменить права доступа к папке, которую вы пытаетесь удалить из / сохранить в. Щелкните правой кнопкой мыши на папке и используйте вкладку "Безопасность", чтобы разрешить изменение прав для пользователя, под которым запускается ваше приложение.
Я также столкнулся с этой проблемой, когда мой оконный сервис начал генерировать исключение
System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.
В качестве решения я проверил учетную запись пользователя, связанную с моей службой, как показано на снимке экрана ниже.
Так что в моем случае это был сетевой сервис
А затем перешел к свойствам папки, чтобы проверить, существует ли связанная учетная запись пользователя также на их вкладке разрешений. В моем случае его не было, и когда я его добавил, это исправило мою проблему.
Для получения дополнительной информации, пожалуйста, проверьте скриншот ниже
Исключение UnauthorizedAccessException выдается, когда операционная система отказывает в доступе из-за ошибки ввода-вывода или ошибки безопасности.
Если вы пытаетесь получить доступ к файлу или разделу реестра, убедитесь, что он не только для чтения.
В моем случае проблема была в Нортоне. Моя собственная программа не имеет надлежащей цифровой подписи, и при попытке удалить файл выдала исключение UnauthorizedAccessException.
Если он отправит вам уведомление, вы можете обработать его оттуда. В моем случае он не дал уведомления, которое я заметил. Итак, вот как предотвратить блокировку программы Norton.
- Откройте Norton
- Щелкните стрелку вниз
- Нажмите История
- Найти активность по программе
- Щелкните Дополнительные параметры
- Нажмите "Исключить процесс".
Я пытался использовать System.IO.File.OpenWrite(путь)
и это не сработало, потому что я только передавал OpenWrite() путь к каталогу, но он требует путь до файла, который вы хотите записать. Таким образом, полный путь, включая filename.extension в конце, должен быть передан в OpenWrite, чтобы избежать UnauthorizedAccessException
Исключение, которое выдается, когда операционная система отказывает в доступе из-за ошибки ввода-вывода или определенного типа ошибки безопасности.
Я ударил то же самое. Убедитесь, что файл НЕ скрыт.
Чтобы решить эту проблему, я следую подходу Скота Хансельмана из статьи Debugging System.UnauthorizedAccessException (часто за которой следует: Доступ к пути запрещен), код с примером приведен ниже:
class Program
{
static void Main(string[] args)
{
var path = "c:\\temp\\notfound.txt";
try
{
File.Delete(path);
}
catch (UnauthorizedAccessException)
{
FileAttributes attributes = File.GetAttributes(path);
if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
{
attributes &= ~FileAttributes.ReadOnly;
File.SetAttributes(path, attributes);
File.Delete(path);
}
else
{
throw;
}
}
}
}
Я столкнулся с этой ошибкой, потому что
Иногда, когда я Combine
путь с именем файла и FileName = ""
Стало Path Directory
не file
что является проблемой, как указано выше
так что вы должны проверить FileName
как это
if(itemUri!="")
File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
Я получил эту ошибку и решил ее за мгновение. Не знаю, почему все мои папки доступны только для чтения , Я отменил доступ только для чтения и применил его. Тем не менее, это все еще только для чтения. Поэтому я переместил файл в корневую папку, он работает - так странно.
Проверьте свойства ваших файлов. Если проверен только для чтения, снимите флажок. Это была моя личная проблема с UnauthorizedAccessException.
Имейте в виду, что если вы пытаетесь найти путь к общей папке из своего кода, вам не нужно только давать надлежащие разрешения физической папке через вкладку безопасности. Вам также необходимо "поделиться" папкой с соответствующим пользователем пула приложений через вкладку "Поделиться"
У меня была такая же проблема на недавно перемещенном веб-сайте на общем сервере. Решено с помощью панели веб-хостинга (DotNetPanel) установить true "разрешить запись". Поэтому, если вы находитесь на общем сервере, прежде чем просматривать весь код, стоит взглянуть на конфигурацию сервера и сэкономить много времени.
Для тех, кто пытается создать приложение UWP (Universal Windows), права доступа к файлам гораздо более ограничены и по умолчанию запрещены. Он также заменяет разрешения пользователя системы. Вы будете иметь доступ только к файлам
- Ваше место установки
- Ваше местоположение AppData
- Файлы, выбранные с помощью средства выбора файлов или папок
- Запрошенные местоположения в вашем манифесте приложения
Подробнее можно прочитать здесь => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions
У меня была точная ошибка при удалении файла. Это была служба Windows, работающая под учетной записью службы, которая не смогла удалить документ.pdf из общей папки, хотя у нее был полный контроль над папкой.
Что мне помогло, так это переход на вкладку "Безопасность" в "Общая папка"> "Дополнительно"> "Поделиться"> "Добавить".
Затем я добавил учетную запись службы в группу администраторов, применил изменения, после чего учетная запись службы смогла выполнять все операции со всеми файлами в этой папке.
После перехода с на
Visual Studio 2019
Я столкнулся с двумя исключениями с двумя моими приложениями, которые правильно работают под
Visual Studio 2017
:
- System.UnauthorizedAccessException
- System.ArgumentException
Оказалось, что мне пришлось добавить исполняемые файлы двух приложений в разрешенные приложения
Avast Antivirus
.
Если вы используете BitDefender, есть большая вероятность, что его функция Safe Files заблокировала вашу работу. Это форма защиты от вымогателей, которая поставляется с некоторыми из более продвинутых версий.
Обязательно предоставьте доступ к вашему приложению в BitDefender и попробуйте снова.
Некоторые подробности можно найти на этой странице поддержки BitDefender.
У меня была такая же проблема, и мне удалось заставить ее работать, изменив раздел, на котором будет сохранен файл. Итак, в строке 5 я изменил @"C:\" на @"D:\", и это решило проблему.
static void SaveVideoToDisk(string link)
{
var youTube = YouTube.Default; // starting point for YouTube actions
var video = youTube.GetVideo(link); // gets a Video object with info about the video
File.WriteAllBytes(@"D:\" + video.FullName, video.GetBytes());
}
В моем случае это был мой антивирус AVG, который вызвал исключение.
Я добавил свой каталог VS Projects в список «Разрешенных». И мне пришлось добавить исполняемый файл в список исключений AVG после того, как я скопировал
.exe
в мой каталог приложений.
Я также наткнулся на этот пост, посвященный той же проблеме. Похоже, что файл уже используется и, следовательно, не может писать в него. Хотя не могу понять, какой процесс его использует. Вышел из системы другой пользователь, который был авторизован в этом ящике, не вижу пользователей, которые его держат. Любые быстрые советы о том, как найти то же самое.
Спасибо, Лакшай (разработчик)
Я тоже столкнулся с той же проблемой при попытке сделать это после развертывания на сервере:
dirPath = Server.MapPath(".") + "\\website\\" + strUserName;
if (!Directory.Exists(dirPath))
{
DirectoryInfo DI = Directory.CreateDirectory(dirPath);
}
string filePath = Server.MapPath(".") + "\\Website\\default.aspx";
File.Copy(filePath, dirPath + "\\default.aspx", true);
File.SetAttributes(dirPath + "\\default.aspx", FileAttributes.Normal);
Я предоставил разрешение в IIS другой группе, включая администратора, и моя проблема была решена.
В моем конкретном случае я неоднократно создавал и удалял 10000 папок. Мне кажется, что проблема была в том, что хотя метод Directory.Delete(path, true)
возвращается, механизм операционной системы все еще может удалять файлы с диска. И когда я начинаю создавать новые папки сразу после удаления старых, некоторые из них все еще заблокированы, потому что они еще не полностью удалены. И я получаю System.UnauthorizedAccessException: "Доступ к пути запрещен".
С помощью Thread.Sleep(5000)
после Directory.Delete(path, true)
решает эту проблему. Я абсолютно согласен с тем, что это небезопасно, и я никого не поощряю к его использованию. Я хотел бы, чтобы здесь был лучший подход к решению этой проблемы, чтобы улучшить мой ответ. Сейчас я просто даю идею, почему это исключение может произойти.
class Program
{
private static int numFolders = 10000;
private static string rootDirectory = "C:\\1";
static void Main(string[] args)
{
if (Directory.Exists(rootDirectory))
{
Directory.Delete(rootDirectory, true);
Thread.Sleep(5000);
}
Stopwatch sw = Stopwatch.StartNew();
CreateFolder();
long time = sw.ElapsedMilliseconds;
Console.WriteLine(time);
Console.ReadLine();
}
private static void CreateFolder()
{
var one = Directory.CreateDirectory(rootDirectory);
for (int i = 1; i <= numFolders; i++)
{
one.CreateSubdirectory(i.ToString());
}
}
}
Сначала просто проверьте путь, если двоеточие (:) отсутствует или отсутствует после буквы диска. Если двоеточие не пропущено, вы можете проверить, предоставлены ли права доступа / записи для этого пути. У меня была та же самая проблема, и я только пропускал двоеточие, разрешение и все остальное было хорошо.
C:\folderpath
будет работать нормально, но,
C\folderpath .........(missing colon)
выдаст вам ошибку отказа в доступе.