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
た二重ゼロ終了文字列として使用することが重要であることに注意してください。