我正在使用Directory.Move(oldDir, newDir)
重命名目錄。我偶爾會得到一個IOException
,表示「訪問路徑'oldDir'被拒絕」。但是,如果我右鍵單擊資源管理器中的目錄,我可以重命名它沒有任何問題。C# - 重命名目錄的方法
所以我的問題是:是否有任何其他方式來重命名目錄而不使用Directory.Move
?
我想過使用命令shell(Process.Start()
),但這應該是我最後一種方式。
進一步詳情
程序仍在運行,我得到的異常和手動Windows資源管理器可以重命名它 - 而我的光標暫停在該斷點(右鍵單擊>重命名) catch塊。我也嘗試在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
零個分隔的雙零個結尾的字符串是很重要的。
http://stackoverflow.com/a/2024022/961113 – Habib
這可能是與文件夾中的文件是「只讀」,並將有一定的權限限制 – LukeHennerley
@Habib不知道你在試着什麼因爲在這個線程中沒有其他方法作爲'Directory.Move'。 @LukeHennerley如果它們是隻讀的,爲什麼我可以在Windows資源管理器中重命名它們? @你是否讀過完整的問題? (不要試圖以任何方式表示) – theknut