UnauthorizedAccessException для вновь созданных файлов

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

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

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

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

Я могу войти в проводник и удалить их. Нет проблем. Нет предупреждений. Просто удаляет. Но сбой кода с "Access to {file} запрещен". Я нахожусь на своем пути с этим, поэтому любая помощь будет оценена.

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

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\entries 'отрицается. "

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

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

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

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

  foreach (строковый файл в ListOfFilesToScan)
{   string newFile = file.Replace(oldRootPath, tempPath);
   // Это работает отлично.   File.Copy(файл, newFile);
   ////NEW  CODE////   // Очистить флаги "Только для чтения"   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);
}

//... сделаем некоторые вещи в кеш, чтобы проверить, что мне нужно.
Код>

Ответ 1

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

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

File.SetAttributes(file, FileAttributes.Normal);

Ответ 2

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

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

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

Ответ 3

Похоже, у вас нет доступа для удаления файла...

system.io.file.delete

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

У вызывающего абонента нет требуемого разрешения.

-or-

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

-or-

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

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

Ответ 7

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

Edit:

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