いくつかのファイルで古いデータを検索しているアプリケーションがあります。良いプロジェクトを壊さないようにするために、ファイルを一時的な場所にコピーしています。私がチェックしているディレクトリのいくつかはソースコードディレクトリであり、それらには.svnフォルダがあります。コードの管理にはSubversionを使用します。
すべてのファイルを検索したら、一時キャッシュを削除したいと思います。簡単そうですね。
何らかの理由で、すべての.svnディレクトリがキャッシュから削除されません。彼らはアプリをクラッシュさせます。
理由(ここに入るには深すぎる)のために、tempフォルダーを使用する必要があるため、政治的な理由から、「元のファイルをスキャンする」だけでは問題外です。
エクスプローラーに移動して削除できます。問題ない。警告はありません。削除するだけです。しかし、「{file}へのアクセスが拒否されました」というコードがクラッシュします。私はこれで終わりですので、どんな助けもいただければ幸いです。
私はあなたの正気のために関数を少し単純化しましたが、コードは本当にこれについて簡単です。
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、およびWindows7で発生します。
*アップデート2* Subversionファイルを調べようとしても、私の検証はありません。しかし、私はそれらが必要です。それは政治的ながらくたの一部です。すべてのファイルがコピーされたことを示さなければなりません...スキャンされたかどうかは関係ありません。
そして、私は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.