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

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 -х вещей:

  • Звонящий не имеет необходимого разрешения.
  • Файл является исполняемым файлом, который используется.
  • Путь это каталог.
  • Путь указывает файл только для чтения.
CrazyTim
источник
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

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

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

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

Бьёрн Отто Васботтен
источник
3

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

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

user3238433
источник
2

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

MOLLMY
источник
2

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

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

reza.Nikmaram
источник
2

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

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

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

Влад Шнаковски
источник
1

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

Drakell
источник
1

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

Kacho
источник
1

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

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

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

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

if(itemUri!="")
        File.Delete(Path.Combine(RemoteDirectoryPath, itemUri));
Башир Аль-Момани
источник
1

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

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

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

LuTheZy
источник
1

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

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

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

Tezra
источник
1

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

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

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

  1. Открыть Нортон
  2. Нажмите стрелку вниз
  3. История кликов
  4. Найти активность по программе
  5. Нажмите Дополнительные параметры
  6. Нажмите Исключить процесс
D_Bester
источник
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

SeanMC
источник
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;
            }
        }
    }
}
Антонио Леонардо
источник