Почему доступ к пути запрещен?


156

У меня проблема с удалением файла, но я получаю исключение.

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

Любые идеи?


4
Что не ясно об исключении? Учетная запись, под которой работает приложение, не имеет прав доступа к файлу / папке.
— Отредактировано

8
Я понимаю, что говорит исключение. Проблема заключается в том, что эта функция используется некоторыми пользователями, которым необходимо изменить изображения с помощью системы. Частично это заменяет изображения, удаляя старое изображение и сохраняя новое изображение.
— Ник Гоуди

Проверьте свои права доступа к папке. дать правильные разрешения для папки, используя вкладку безопасности из окна свойств
— gasroot

6
Исключение совсем не информативно. Он не говорит вам: A. Какой принципал пытается получить доступ к ресурсу B. Какое разрешение ему нужно. Чтобы выяснить это, требуется установить Windows SysInternals и отслеживать путь доступа.
— ATL_DEV

Ответы:


184

По методу File.Delete ...

UnauthorizedAccessExceptionОзначает один из 4 -х вещей:

  • Звонящий не имеет необходимого разрешения.
  • Файл является исполняемым файлом, который используется.
  • Путь это каталог.
  • Путь указывает файл только для чтения.

77
Путь это каталог. Мне
— За Г

4
Произошло со мной вчерашнее лицевое лицо . Я ненавижу это неоднозначное сообщение об исключении :(
— Broken_Window

1
Я боролся более 6 часов и, посмотрев на ваш ответ, увидел, что путь был каталогом ... спасибо огромное @CrazyTim ..
— Пользователь M

6
Path is a directory.спасибо за этот совет :) Это помогло мне.
— Сидрон

8
О, мой ... Путь это каталог. Спасибо Microsoft. Это ОЧЕНЬ несанкционированный доступ.
— SeriousM

181

У меня тоже была проблема, поэтому я споткнулся на этом посте. Я добавил следующую строку кода до и после копирования / удаления.

Удалить

File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);

копия

File.Copy(file, dest, true);
File.SetAttributes(dest, FileAttributes.Normal);

17
Я дал «Все» полные права на папку без успеха. Как-то эти атрибуты файла работали, хотя. Спасибо. Я бы хотел, чтобы М.С. наконец-то остановилась на правильной модели безопасности. Попытка выяснить, почему Копирование / Удаление взрывается каждые несколько лет, разочаровывает, если не сказать больше.
— Стив

13
SetAttributes Normal была уловка для меня - я пытался File.Copy и перезаписать файл только для чтения ..
— Том Хантер

6
Доступ к пути запрещен, не означает, что файл просто доступен только для чтения (поскольку у вас действительно есть доступ к пути!). По моему мнению, сообщение об ошибке должно быть изменено. Спасибо за подсказку в любом случае!
— MBoros

1
Я запустил программу от имени администратора, и проблема исчезла.
— Сантьяго Вильяфуэрте

5
Как помогает установка атрибута после операции копирования? Не произойдет ли сбой программы при копировании? Должно ли это быть до операции копирования, как операция удаления?
— Vibhore Tanwer

31

Это старая проблема, но я столкнулся с ней во время поиска. Оказывается, я пропустил фактический компонент имени файла в пути сохранения для SaveAs ...

string uploadPath = Server.MapPath("~/uploads");
file.SaveAs(uploadPath); // BAD
file.SaveAs(Path.Combine(uploadPath, file.FileName)); // GOOD

18

Когда пользователь пытается подключиться к вашему веб-сайту, IIS назначает подключение учетной записи IUSER_ComputerName , где ComputerName - это имя сервера, на котором работает IIS. По умолчанию учетная запись IUSER_ComputerName является членом группы «Гости». Эта группа имеет ограничения безопасности. Попробуйте получить доступ к IUSER_ComputerName к этой папке

Вот очень хорошо описан ответ о безопасности IIS

Надеюсь это поможет


Спасибо, это помогло .. Разрешение для пользователя IIS_IUSRS.
— Том

13

Щелкните правой кнопкой мыши Visual Studio и выберите Запуск от имени администратора.


Это было решением для моей проблемы File.Move на компьютере с Windows 8.1 Enterprise, на котором я был локальным администратором, и ничто иное не имело ручки для файлов.
— Роберт Керр

13

Я получил ошибку, потому что я не понимал, что местом назначения должен быть файл. У меня была папка как второй параметр (который работает в 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


1
Спасибо! Это косвенно решило проблему, когда API ожидал пункт назначения, который я дал в качестве каталога, не осознавая, что он должен включать имя файла (поскольку сам объект имеет ассоциированное имя файла).
— Остин Салгат

7

Если это веб-сайт IIS, в котором возникла проблема, проверьте свойство Identity дополнительных параметров для пула приложений, который используется сайтом или приложением. Вы можете обнаружить, что для него установлено значение ApplicationPoolIdentity, и в этом случае именно этот пользователь должен иметь доступ к пути.

Или вы можете пойти по старому стилю и просто установить для Identity значение Network Service и предоставить пользователю Network Service доступ к пути.


3

Вам нужно изменить права доступа к папке, которую вы пытаетесь удалить из / сохранить в. Щелкните правой кнопкой мыши на папке и используйте вкладку «Безопасность», чтобы разрешить изменение прав для пользователя, под которым запускается ваше приложение.


вы предполагаете, что он является администратором своей машины ... если это рабочая машина, а он всего лишь пользователь ... они, вероятно, установили разрешения таким образом по причине ... так как нам осталось только предположить
— MethodMan

1
Это рабочая машина, и я опытный пользователь. Я не захожу как администратор. Свойства папки с изображениями были изменены, поэтому сетевые службы имеют полный доступ. Но это не имело никакого значения.
— Ник Гоуди

1
Я только что добавил «Все» с полным доступом к папке, и «вуаля»
— MarceloBarbosa

3

Исключение, которое выдается, когда операционная система отказывает в доступе из-за ошибки ввода-вывода или определенного типа ошибки безопасности.

Я ударил то же самое. Убедитесь, что файл НЕ скрыт.


3

Я также столкнулся с этой проблемой, когда мой оконный сервис начал генерировать исключение

System.UnauthorizedAccessException: Access to the path "C:\\Order\\Media
44aa4857-3bac-4a18-a307-820450361662.mp4" is denied.

В качестве решения я проверил учетную запись пользователя, связанную с моей службой, как показано на снимке экрана ниже.

введите описание изображения здесь

Так что в моем случае это был сетевой сервис

А потом зашел в свойства папки чтобы проверить, существует ли связанная учетная запись пользователя на вкладке их разрешений. В моем случае его не было, и когда я его добавил, это исправило мою проблему.

Для получения дополнительной информации, пожалуйста, проверьте скриншот ниже

введите описание изображения здесь


3

та же проблема для меня, я указывал папку, а не файл.

поэтому убедитесь, что в пути, укажите путь + имя файла

System.IO.File.WriteAllBytes("path", bytearray);

2

Проверьте свойства ваших файлов. Если проверен только для чтения, снимите флажок. Это была моя личная проблема с UnauthorizedAccessException.


2

Я получил эту ошибку и решил ее всего за мгновение. Не знаю, почему все мои папки доступны только для чтения , Я отменил доступ только для чтения и применил его. Тем не менее, это все еще только для чтения. Поэтому я переместил файл в корневую папку, он работает - так странно.


2

Исключение UnauthorizedAccessException выдается, когда операционная система отказывает в доступе из-за ошибки ввода-вывода или ошибки безопасности.

Если вы пытаетесь получить доступ к файлу или разделу реестра, убедитесь, что он не только для чтения .


2

Если вы используете BitDefender, есть большая вероятность, что его безопасные файлы функция заблокировала вашу работу. Это форма защиты от вымогателей, которая поставляется с некоторыми из более продвинутых версий.

Обязательно предоставьте доступ к вашему приложению в BitDefender и повторите попытку.

Некоторые подробности можно найти на этой странице поддержки BitDefender .


1

У меня была такая же проблема на недавно перемещенном веб-сайте на общем сервере. Решено с помощью панели веб-хостинга (DotNetPanel) установить true «разрешить запись». Поэтому, если вы находитесь на общем сервере, прежде чем просматривать весь код, стоит взглянуть на конфигурацию сервера и сэкономить много времени.


1

Имейте в виду, что если вы пытаетесь найти путь к общей папке из своего кода, вам не нужно только давать надлежащие разрешения для физической папки через вкладку безопасности. Вам также необходимо «поделиться» папкой с соответствующим пользователем пула приложений через вкладку «Поделиться»


1

Я столкнулся с этой ошибкой, потому что

Иногда , когда я путь с именем файла иCombineFileName = ""

Это Path Directoryне fileпроблема, о которой говорилось выше.

так что вы должны проверить, FileNameкак это

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));

1

У меня была точная ошибка при удалении файла. Это была служба Windows, работающая под учетной записью службы, которая не смогла удалить документ .pdf из общей папки, хотя у нее был полный контроль над папкой.

Что мне помогло, так это переход на вкладку «Безопасность» в «Общая папка»> «Дополнительно»> «Поделиться»> «Добавить».

Затем я добавил служебную учетную запись в группу администраторов, применил изменения, после чего учетная запись службы смогла выполнить все операции со всеми файлами в этой папке.


1

Для тех, кто пытается создать приложение UWP (Universal Windows), права доступа к файлам гораздо более ограничены и, по умолчанию, вообще запрещены. Он также заменяет разрешения пользователя системы. В основном вы будете иметь доступ к файлам только в

  • Ваше место установки
  • Ваше местоположение AppData
  • Файлы , выбранные с помощью файла или папки подборщика
  • Запрошенные местоположения в вашем манифесте приложения

Вы можете прочитать больше здесь для получения подробной информации => https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions


1

В моем случае проблема была в Нортоне. Моя внутренняя программа не имеет надлежащей цифровой подписи, и когда она пыталась удалить файл, она выдавала исключение UnauthorizedAccessException.

введите описание изображения здесь

Если он дает вам уведомление, вы можете обработать его оттуда. В моем случае он не дал уведомление, что я заметил. Итак, вот как удержать Нортона от блокировки программы.

  1. Открыть Нортон
  2. Нажмите стрелку вниз
  3. История кликов
  4. Найти активность по программе
  5. Нажмите Дополнительные параметры
  6. Нажмите Исключить процесс

0

Я тоже столкнулся с той же проблемой при попытке сделать это после развертывания на сервере:

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 другой группе, включая администратора, и моя проблема была решена.


0

Я обнаружил, что эта ошибка может возникнуть в режиме дизайна, а не? Режим выполнения ... Если вы делаете что-то, например, создаете член класса, который требует доступа к файлу .INI или .HTM (файл конфигурации, файл справки), вы можете НЕ захотеть инициализировать элемент в объявлении, но инициализировать его позже. в FORM_Load () и т.д ... Когда вы действительно инициализируете ... Используйте защитный оператор IF:

    /// <summary>FORM: BasicApp - Load</summary>
    private void BasicApp_Load(object sender, EventArgs e)
    {
        // Setup Main Form Caption with App Name and Config Control Info
        if (!DesignMode)
        {
            m_Globals = new Globals();
            Text = TGG.GetApplicationConfigInfo();
        }
    }

Это не позволит MSVS Designer пытаться создать файл INI или HTM, когда вы находитесь в режиме разработки.


0

Я получил эту ошибку, когда попытался переименовать папку очень быстро после того, как она была перемещена или создана.

Простое System.Threading.Thread.Sleep(500);решил это:

void RenameFile(string from, string to)
{
   try
   {   
      System.IO.File.Move(from, to)      
   }   
   catch 
   {  
       System.Threading.Thread.Sleep(500);      
       RenameFile(from, to);      
   }   
}

Думаю, было бы лучше, если бы вы проверили, существует ли папка, прежде чем перемещать ее, а не спать в течение полсекунды ... если ОС занята, предыдущее перемещение может занять больше полсекунды, и вы вернетесь к той же проблеме.
— Пол Захра

Этот кусок кода очень опасен. Он повторяет метод RenameFile независимо от того, какое исключение выдается! Это может привести к сбою приложения, если причиной исключения является фактическая проблема с разрешениями
— Hossein Shahdoost

0

В моем конкретном случае я неоднократно создавал и удалял 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());
        }
    }
}

0

Сначала просто проверьте путь, если двоеточие (:) отсутствует или отсутствует после буквы диска. Если двоеточие не пропущено, вы можете проверить, предоставлены ли права доступа / записи для этого пути. У меня была та же самая проблема, и я только пропускал двоеточие, разрешение и все остальное было хорошо.

C:\folderpath

будет работать нормально, но,

C\folderpath .........(missing colon)

выдаст вам ошибку отказа в доступе.


0

Я пытался использовать System.IO.File.OpenWrite (путь)

и это не сработало, потому что я только передавал OpenWrite () путь к каталогу, но он требует путь до файла, который вы хотите записать. Таким образом, полный путь, включая filename.extension в конце, должен быть передан в OpenWrite, чтобы избежать UnauthorizedAccessException


0

Я также наткнулся на этот пост, как имеющий дело с той же проблемой. Похоже, файл используется и, следовательно, не может записать в него. Хотя не в состоянии понять, какой процесс его использует. Вышел из системы другой пользователь, который вошел в этот ящик, не видит пользователей, которые его держат. Любые быстрые советы относительно того, как найти то же самое.

Спасибо, Лакшай (разработчик)


В своем ответе не публикуйте новый вопрос, но попробуйте ответить на вопрос оригинального постера с полезной информацией. Для вашего собственного вопроса, пожалуйста, сначала ищите stackoverflow для тех же или похожих вопросов. Если вы не нашли какой - либо, добавить новый вопрос после этого руководства: Как задать хороший вопрос
— АЛЕВ

0

Чтобы решить эту проблему, я придерживаюсь подхода Скотта Хансельмана в статье « Отладка 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;
            }
        }
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.