UnauthorizedAccessException для вновь создаваемых файлов - PullRequest
10 голосов
/ 05 января 2010

У меня есть приложение, которое просматривает некоторые файлы для старых данных. Чтобы мы не испортили хорошие проекты, я копирую файлы во временную папку. Некоторые из каталогов, которые я проверяю, являются каталогами с исходным кодом, и у них есть папки .svn. Мы используем Subversion для управления нашим кодом.

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

По какой-то причине все мои каталоги .svn не удаляются из кэша. Они ломают приложение.

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

Я могу зайти в проводник и удалить их. Нет проблем. Нет предупреждений. Просто удаляет. Но код вылетает с сообщением «Доступ к {файлу} запрещен». Я в своем уме с этим, поэтому любая помощь будет оценена.

Хотя я ради вашей здравомыслии упростил функцию МАЛЕНЬКИЙ, код ДЕЙСТВИТЕЛЬНО об этом прост.

</p> <pre><code>List<string> tmpCacheManifest = new List<string>(); string oldRootPath = "C:\\some\\known\\directory\\"; string tempPath = "C:\\temp\\cache\\"; foreach (string file in ListOfFilesToScan) { string newFile = file.Replace(oldRootPath, tempPath); // This works just fine. File.Copy(file, newFile); tmpCacheManifest.add(newFile); } // ... do some stuff to the cache to verify what I need. // Okay.. I'm done.. Delete the cache. foreach (string file in tmpCacheManifest) { // CRASH! File.Delete(file); }

* Обновление *: Исключением является UnauthorizedAccessException. Текст: «Доступ к пути« C: \ temp \ cache \ some-sub-dirs \ .svn \ records »запрещен».

Это происходит под XP, XP-Pro и Windows 7.

* Обновление 2 * Ни одна из моих проверок даже НЕ ПОТЕРЯЕТСЯ просматривать файлы подрывной деятельности. Однако они мне нужны. Это часть политического дерьма. Я должен показать, что КАЖДЫЙ файл был скопирован ... был ли он отсканирован или нет.

И я понимаю, что обычные подозреваемые для File.Delete. Я понимаю, что означает UnauthorizedAccessException. У меня нет доступа. Это легко. Но я только что скопировал файл. Как я могу НЕ иметь доступ к файлу?

* Обновление 3 * Ответ был во флаге «только для чтения». Вот код, который я использовал, чтобы исправить это:

    foreach (string file in ListOfFilesToScan)
{
    string newFile = file.Replace(oldRootPath, tempPath);

    // This works just fine.
    File.Copy(file, newFile);

    //// NEW CODE ////
    // Clear any "Read-Only" flags
    FileInfo fi3 = new FileInfo(fn);
    if ((fi3.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
    {
        fi3.Attributes = (FileAttributes)(Convert.ToInt32(fi3.Attributes) - Convert.ToInt32(FileAttributes.ReadOnly));
    }



    tmpCacheManifest.add(newFile);
}

//    ... do some stuff to the cache to verify what I need.

Ответы [ 7 ]

12 голосов
/ 05 января 2010

Насколько я помню, Subversion помечает файлы в своих подкаталогах .svn только для чтения.

Попробуйте сбросить атрибут «только для чтения» перед удалением файла. Я действительно не знаю C #, но быстрый Google предполагает, что это может сработать:

File.SetAttributes(file, FileAttributes.Normal);
2 голосов
/ 05 января 2010

Звучит так, будто у вас нет доступа для удаления файла ...

system.io.file.delete

Приведенная выше ссылка говорит, что вы получаете UnauthorizedAccessException, когда:

У вызывающей стороны нет необходимых разрешений.

-или-

путь к каталогу.

-или-

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

Это один из них.

2 голосов
/ 05 января 2010

Единственная проблема, которую я вижу, будет в этой части:

// ... do some stuff to the cache to verify what I need.

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

1 голос
/ 05 января 2010

Похоже, проблема с разрешениями. Сложно, хотя, поскольку у вас, очевидно, есть доступ на запись, если File.Copy уже работает ....

Единственное, о чем я мог подумать, это то, что у файла все еще есть дескриптор, открытый где-то (как другие, возможно, предложили в вашей сделать что-то для кеша часть).

0 голосов
/ 02 июня 2012

Если папка содержит файлы только для чтения, Directory.Delete не удалит ее и выдаст исключение, которое вы получаете. Для будущих посетителей этой страницы я нашел простое решение, которое не требует от нас повторения всех файлов и изменения их атрибута только для чтения:

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

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

0 голосов
/ 05 января 2010

Прежде всего: «Сбой» означает исключение, верно? Который из? Можешь поймать и показать?

Второе: вы копируете репозитории Subversion, хотя вам не нужны метаданные Subversion? Вот что такое экспорт svn (в целевом каталоге нет .svn).

Ответ на первый вопрос - это то, что вам действительно нужно предоставить. Может быть, что-то захватывает .svn и блокирует некоторые файлы. Может быть, TortoiseSVN (чтобы дать вам хорошие значки наложения ..)?

0 голосов
/ 05 января 2010

Не понимая, что вы так много хотите сделать, но как насчет того, чтобы изменить его на 777 или 775.: - /

Edit:

заметил ваш на окнах. Вы должны изменить разрешения. Не знаю, как Windows это делает: - /

...