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