Чому доступ до шляху заборонено?


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: \ Користувачі \ gowdyn \ Документи \ Visual Studio 2008 \ Проекти \ гібрид \ гібрид \ 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 C Документи \ Visual Studio 2008 \ Проекти \ гібрид \ гібрид \ User_Controls \ Imgloader_Add_Edit_Tbl.ascx.cs: рядок 242

Будь-які ідеї?


4
Що не зрозуміло у винятку? Обліковий запис, під яким працює програма, не має прав доступу до файлу / папки.
Oded

8
Я розумію, про що говорить виняток. Проблема в тому, що ця функціональність використовується деякими користувачами, яким потрібно змінювати зображення за допомогою системи. Частина цього - це заміна зображень, видалення старого зображення та збереження нового зображення.
нік gowdy

Перевірте дозволи на доступ до папки. надайте належні дозволи для папки за допомогою вкладки безпеки з вікна властивостей
gasroot

6
Виняток зовсім не інформативний. Це не говорить вам: А. Який головний прагне отримати доступ до ресурсу B. Який дозвіл потрібен. Для цього потрібно встановити Windows SysInternals та контролювати доступ до шляху.
ATL_DEV

Відповіді:


184

Відповідно до методу File.Delete ...

Засіб UnauthorizedAccessExceptionодне з 4 речей:

  • Абонент не має необхідного дозволу.
  • Файл - це виконуваний файл, який використовується.
  • Шлях - це каталог.
  • Шлях вказав файл лише для читання.

76
Шлях - це каталог. Збентежуючи мене: /
Per G

4
Сталося мені вчора facepalm . Я ненавиджу ці амбітні повідомлення про виключення :(
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
Я дав "усім" повні дозволи на папку без успіху. Хоча якось ці атрибути файлів спрацювали. Дякую. Я б хотів, щоб MS нарешті влаштувались на належну модель безпеки. Спроба з'ясувати, чому "Копіювати / видаляти" вибухає кожні кілька років, найменш неприємно.
Стів

13
SetAttributes Normal був для мене хитрістю - я намагався File.Копіювати та перезаписати файл лише для читання ..
Том Хантер

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

Або ви можете перейти в старий стиль і просто встановити особу для мережевої послуги та надати користувачеві мережі послугу доступ до шляху.


3

Вам потрібно змінити привілеї папки, з якої ви намагаєтесь видалити / зберегти. Клацніть правою кнопкою миші на папці, що містить, і скористайтеся вкладкою Безпека, щоб дозволити змінити права для користувача, під яким працює ваша програма.


ви припускаєте, що він адміністратор своєї машини .. якщо це робоча машина, і він просто користувач .. вони, ймовірно, встановили дозволи таким чином з причини .. оскільки нам залишається лише припустити
MethodMan

1
Це робоча машина, і я - споживач енергії. Я не входжу як адміністратор. Властивості папки зображень були змінені, щоб мережеві послуги мали повний доступ. Але це не мало значення.
нік gowdy

1
Щойно я додав "Усі" з повним доступом до папки та "voilá"
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

Перевірте властивості файлів. Якщо встановлено прапорець лише для читання, зніміть його. Це було моїм особистим питанням щодо несанкціонованого доступу.


2

Я отримав цю помилку і вирішив її лише за мить. Не знаю, чому всі мої папки є лише для читання , Я скасував лише читання і застосував його. Однак це все ще лише для читання. Тому я перемістив файл у кореневу папку, він працює - так дивно.


2

Виняток UnauthorizedAccessException видається, коли операційна система забороняє доступ через помилку вводу-виводу або помилку безпеки.

Якщо ви намагаєтеся отримати доступ до файлу або ключа реєстру, переконайтеся, що він не лише для читання .


2

Якщо ви використовуєте BitDefender, є хороший шанс, що функція безпечних файлів заблокувала вашу роботу. Це форма захисту від Ransomware, яка постачається з деякими більш досконалими версіями.

Переконайтеся, що надайте програмі доступ у BitDefender та повторіть спробу.

Ще кілька деталей можна знайти на цій сторінці підтримки BitDefender .


1

У мене була така ж проблема на нещодавно переміщеному веб-сайті на спільному сервері. Вирішено через панель веб-хостів (DotNetPanel), встановивши істину, "дозволити запис". Отже, якщо ви перебуваєте на спільному сервері, перш ніж переглянути весь код, варто переглянути конфігурацію сервера і це може заощадити вам багато часу.


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.

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

Якщо він дасть вам сповіщення, ви можете з ним звернутися. У моєму випадку це повідомлення не дало, що я помітив. Тож ось як уберегти Norton від блокування програми.

  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 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 не намагатися створити файл 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 незалежно від того, який виняток викинуто! Це може спричинити збій програми, якщо причиною виключення є фактична проблема з дозволом
Хоссейн Шахдуст,

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 () шлях до каталогу, але йому потрібен шлях аж до файлу, який ви хочете написати. Отже, повний шлях, що включає кінець файла.extension в кінці, повинен бути переданий у OpenWrite, щоб уникнути UnauthorizedAccessException


0

Я також наткнувся на цю посаду, коли займався тим же питанням. Схоже, файл використовується, і тому він не може записати його. Хоча не в змозі розібратися, який процес використовує. Вийшов із іншого користувача, який увійшов до цього вікна, не бачити користувачів, які його мають. Будь-які швидкі поради щодо того, як знайти те саме.

Дякуємо, Lakshay (розробник)


У своїй відповіді не публікуйте нового питання, але спробуйте відповісти на питання оригінального плаката корисною інформацією. Для власного запитання, будь ласка, знайдіть спочатку stackoverflow для тих самих чи подібних питань. Якщо ви не знайдете жодного, опублікуйте нове запитання, керуючись цим керівництвом: Як задати гарне запитання
alev

0

Щоб вирішити цю проблему, я дотримуюся підходу Скотта Ганзельмана на налагоджувальній системі. UnnauthorizedAccessException (за яким часто слід звертатись до статті : Доступ до шляху заборонено) , код із прикладом наведено нижче:

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.