2013-05-15 86 views
1

我正在使用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); 
} 

請注意使用pTopFrom零個分隔的雙零個結尾的字符串是很重要的。

+0

http://stackoverflow.com/a/2024022/961113 – Habib

+0

這可能是與文件夾中的文件是「只讀」,並將有一定的權限限制 – LukeHennerley

+0

@Habib不知道你在試着什麼因爲在這個線程中沒有其他方法作爲'Directory.Move'。 @LukeHennerley如果它們是隻讀的,爲什麼我可以在Windows資源管理器中重命名它們? @你是否讀過完整的問題? (不要試圖以任何方式表示) – theknut

回答

2

您可以嘗試使用P/Invoke調用SHFileOperation API(或IFileOperation接口)。這是Explorer在理論上使用的,所以它應該更直接地複製功能。

+0

我的英雄!你怎麼知道這一切?只是很好奇...... – theknut

0

嘗試使用DirectoryInfo.MoveTo()而不是Directory.Move()。

此外,檢查this old SO question:它似乎並沒有找到你想要的例外,但你可以找到一些好的建議。