1

Directory.Move(oldDir, newDir)ディレクトリの名前を変更するために使用しています。時々、「パス ' oldDir IOException' へのアクセスが拒否されました」というメッセージが表示されます。ただし、エクスプローラーでディレクトリを右クリックすると、問題なく名前を変更できます。

だから私の質問は:を使用せずにディレクトリの名前を変更する他の方法はありますDirectory.Moveか?

コマンド シェル ( Process.Start()) を使用することも考えましたが、これが最後の方法です。


詳細

プログラムはまだ実行中です。例外が発生し、カーソルが catch ブロックのブレークポイントで一時停止している間に、Windows エクスプローラーで手動で名前を変更できます (右クリック -> 名前の変更)。また、にブレークポイントを設定しようとDirectory.Moveしましたが、エクスプローラーでディレクトリの名前を正常に変更し (そして元に戻しました)、ステップ オーバーDirectory.Moveしてcatch (IOException)再び .

これが私のコードです

public bool Copy()
{
    string destPathRelease = ThisUser.DestPath + "\\Release";

    if (Directory.Exists(destPathRelease))
    {
        try
        {
            string newPath = ThisUser.DestPath + '\\' + (string.IsNullOrEmpty(currBuildLabel) ? ("Release" + '_' + DateTime.Now.ToString("yyyyMMdd_HHmmss")) : currBranchName) + '.' + currBuildLabel;
            Directory.Move(destPathRelease, newPath);
        }   
        catch (IOException)
        {
           // Breakpoint
        }
    }
}

ご覧のとおり、メソッドを入力したところです。これまでプログラムでディレクトリに触れたことはありませんでした。

この方法ではうまくいかないので、別の方法を見つける必要があります。


解決

public bool Copy()
{
    string destPathRelease = ThisUser.DestPath + "\\Release";

    SHFILEOPSTRUCT struc = new SHFILEOPSTRUCT();

    struc.hNameMappings = IntPtr.Zero;
    struc.hwnd = IntPtr.Zero;
    struc.lpszProgressTitle = "Rename Release directory";
    struc.pFrom = destPathRelease + '\0';
    struc.pTo = ThisUser.DestPath + '\\' + (string.IsNullOrEmpty(this.currBuildLabel) ? ("Release" + '_' + DateTime.Now.ToString("yyyyMMdd_HHmmss")) : this.currBranchName) + '.' + this.currBuildLabel + '\0';
    struc.wFunc = FileFuncFlags.FO_RENAME;

    int ret = SHFileOperation(ref struc);
}

pToゼロで区切られpFromた二重ゼロ終了文字列として使用することが重要であることに注意してください。

4

2 に答える 2

2

P/Invoke を使用してSHFileOperationAPI (またはIFileOperationインターフェイス) を呼び出すことができます。これは Explorer が理論的に使用するものであるため、機能をより直接的に複製する必要があります。

于 2013-05-15T09:49:35.273 に答える
0

Directory.Move() の代わりに DirectoryInfo.MoveTo() を使用してみてください。

また、この古いSOの質問を確認してください。あなたが考えているのと同じ例外はないようですが、良いアドバイスを見つけることができます.

于 2013-05-15T09:42:01.143 に答える