У меня есть приложение, которое просматривает некоторые файлы для старых данных. Чтобы мы не испортили хорошие проекты, я копирую файлы во временную папку. Некоторые из каталогов, которые я проверяю, являются каталогами с исходным кодом, и у них есть папки .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.