UnauthorizedAccessException пытается удалить файл в папке, где я могу удалить другие файлы с тем же кодом - PullRequest
15 голосов
/ 21 июля 2009

Я получаю исключение неавторизованного доступа

  • в файле, который я могу удалить вручную.
  • в папке, где я могу удалить по коду другие файлы
  • и файл не помечен как только для чтения
  • кроме того, я использую Windows XP на отдельном компьютере и не назначил никаких разрешений для папки или файла.
  • файл не используется другим процессом

Если это поможет, это код, где происходит исключение:

protected void DeleteImage(string imageName)
{
    if (imageName != null)
    {
        string f = String.Format("~/Images/{0}", imageName);
        f = System.Web.Hosting.HostingEnvironment.MapPath(f);
        if (File.Exists(f))
        {
            if (f != null) File.Delete(f);
        }
    }
}

Почему это могло произойти?

Ответы [ 6 ]

22 голосов
/ 15 декабря 2011

Я столкнулся с той же проблемой и обнаружил, что при написании моей собственной оболочки Directory.Delete ее исправили. По умолчанию это рекурсивно:

using System.IO;

public void DeleteDirectory(string targetDir)
{
    File.SetAttributes(targetDir, FileAttributes.Normal);

    string[] files = Directory.GetFiles(targetDir);
    string[] dirs = Directory.GetDirectories(targetDir);

    foreach (string file in files)
    {
        File.SetAttributes(file, FileAttributes.Normal);
        File.Delete(file);
    }

    foreach (string dir in dirs)
    {
        DeleteDirectory(dir);
    }

    Directory.Delete(targetDir, false);
}
6 голосов
/ 02 июня 2012

Если каталог содержит файл только для чтения, он не удалит его с помощью Directory.Delete. Это глупая реализация MS.

Я удивлен, что никто не предлагал этот метод в Интернете, который удаляет каталог, не просматривая его и не изменяя атрибуты каждого файла. Вот что:

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

(Измените немного, чтобы не запускать окно cmd, которое доступно по всему Интернету)

3 голосов
/ 21 июля 2009

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

1 голос
/ 21 июля 2009

Сначала проверяем очевидное ...

При открытии свойства файла и взглянуть на его настройки безопасности. Имеет ли пользователь, выполняющий код (то есть, если это ASP.NET, сетевые службы / учетная запись службы домена), доступ к фактическому удалению файла? Если это не так, измените его и попробуйте снова.

Вы работаете как администратор, когда пытаетесь удалить это вручную? Если да, то, вероятно, поэтому вы можете удалить его вручную. Попробуйте удалить его как учетную запись, на которой работает ASP.NET (я предполагаю, что это ASP.NET, поскольку вы используете System.Web.Hosting.HostingEnvironment.MapPath.)

Если оба сбоя, попробуйте посмотреть, действительно ли какой-либо другой процесс в настоящее время использует этот файл. Хороший инструмент, чтобы узнать это SysInternal Process Monitor. Отфильтруйте его по пути, содержащему ваше имя файла, и вы должны увидеть, если оно используется. Завершите процесс и попробуйте снова.

0 голосов
/ 29 апреля 2016

Я тоже столкнулся с той же проблемой, но в конце концов предложил общий подход. Ниже приведены мои коды.

String pathfile = "C: \ Users \ Public \ Documents \ Filepath.txt";

            if (!Directory.Exists(pathfile))
            {
                File.SetAttributes(pathfile, FileAttributes.Normal);
                File.Delete(pathfile);
            }


                using (FileStream fs = File.Create(pathfile))
                {
                    Byte[] info = new UTF8Encoding(true).GetBytes("What Ever Your Text is");

                    fs.Write(info, 0, info.Length);
                    File.SetAttributes(pathfile, FileAttributes.ReadOnly);

                }
0 голосов
/ 21 июля 2009

Вы, пользователь-пользователь, имеете логин с определенными правами. Веб-сервер может иметь другой логин с разными правами. Пользователь, начинающийся с IUSR_XXXX или чего-то подобного. Убедитесь, что у пользователя есть права на каталог.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...