10

いくつかのファイルで古いデータを検索しているアプリケーションがあります。良いプロジェクトを壊さないようにするために、ファイルを一時的な場所にコピーしています。私がチェックしているディレクトリのいくつかはソースコードディレクトリであり、それらには.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.

4

7 に答える 7

12

私が覚えている限り、Subversionはその.svnサブディレクトリ内のファイルを読み取り専用としてマークします。

ファイルを削除する前に、読み取り専用属性をリセットしてみてください。私はC#を本当に知りませんが、簡単なGoogleは、これでうまくいくかもしれないと示唆しています。

File.SetAttributes(file, FileAttributes.Normal);
于 2010-01-05T16:33:17.717 に答える
2

私が見る唯一の問題はこの部分にあります:

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

ファイルを開いて閉じるのを忘れた場合でも、ファイルへの排他的アクセス権があるため、後で削除することはできません。

于 2010-01-05T16:25:04.740 に答える
2

ファイルを削除するためのアクセス権がないようです...

system.io.file.delete

上記のリンクは、次の場合に取得することを示していますUnauthorizedAccessException

発信者には必要な権限がありません。

-また-

パスはディレクトリです。

-また-

パスで読み取り専用ファイルが指定されました。

それはそれらの1つです。

于 2010-01-05T16:25:53.817 に答える
1

権限の問題のように聞こえます。File.Copyがすでに機能している場合は、明らかに書き込みアクセス権があるため、注意が必要です。

私が考えることができる唯一のことは、ファイルがまだどこかで開いているハンドルを持っているということです(他の人がおそらくあなたの中でキャッシュ部分に何かをすることを提案しているように)。

于 2010-01-05T16:28:49.020 に答える
0

まず第一に、「クラッシュ」は例外を意味しますよね?どれ?捕まえて見せてもらえますか?

2番目のこと:Subversionメタデータは気にしないのに、Subversionリポジトリをコピーしていますか?それがsvnexportの目的です(ターゲットに.svnディレクトリはありません)。

最初の質問に対する答えは、あなたが本当に提供する必要があるものです。たぶん何かが.svnをつかんで、いくつかのファイルをロックします。TortoiseSVNは多分(あなたに素敵なオーバーレイアイコンを与えるために..)?

于 2010-01-05T16:23:03.840 に答える
0

フォルダに読み取り専用ファイルが含まれている場合、Directory.Deleteはそのフォルダを削除せず、発生する例外を発生させます。このページの将来の訪問者のために、すべてのファイルを繰り返し処理して読み取り専用属性を変更する必要のない簡単な解決策を見つけました。

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

(インターネット全体で利用可能なcmdウィンドウを一時的に起動しないように少し変更します)

于 2012-06-02T06:04:20.463 に答える
-2

何をしたいのかわからないが、777または775に変更するのはどうだろう。:-/

編集:

あなたの窓に気づいた。権限を変更する必要があります。Windowsがそれをどのように行うのかわからない:-/

于 2010-01-05T16:20:43.417 に答える