Почему доступ к пути запрещен? - PullRequest
135 голосов
/ 11 января 2012

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

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

Есть идеи?

Ответы [ 26 ]

0 голосов
/ 22 января 2019

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

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

0 голосов
/ 19 сентября 2014

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

Простое 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);      
   }   
}
0 голосов
/ 14 ноября 2018

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

C:\folderpath

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

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

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

0 голосов
/ 21 августа 2018

В моем конкретном случае я неоднократно создавал и удалял 10000 папок.Мне кажется, что проблема заключалась в том, что, хотя метод Directory.Delete(path, true) возвращает, механизм ОС, который находится ниже, может все еще удалять файлы с диска.И когда я начинаю создавать новые папки сразу после удаления старых, некоторые из них все еще заблокированы, потому что они еще не полностью удалены.И я получаю System.UnauthorizedAccessException: «Доступ к пути запрещен».

enter image description here

Использование 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 голосов
/ 17 февраля 2014

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

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

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

...