2011-06-06 289 views
2

我已經通過互聯網搜索了這方面的信息,但仍未找到解決方案。作爲最終嘗試,我希望有人能給我一個確切的答案。複製文件時出現「無法找到路徑的一部分」錯誤

我試圖在文件資源管理器中嘗試將文件從目錄複製到另一個文件時出現此錯誤。它有一個treeview控件來瀏覽目錄和一個listview控件來顯示目錄的內容。這是代碼會是什麼樣子,部分:

private void copyToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     sourceDir = treeView1.SelectedNode.FullPath; 
     for (int i = 0; i < listView1.SelectedItems.Count; ++i) 
     { 
      ListViewItem l = listView1.SelectedItems[i]; 
      toBeCopied[i] = l.Text; // string[] toBeCopied, the place where I save the file names I want to save 
     } 
    } 


private void pasteToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     targetDir = treeView1.SelectedNode.FullPath; 
     try 
     { 
      for (int i = 0; i < toBeCopied.Length; ++i) 
      { 
       File.Copy(sourceDir + "\\" + toBeCopied[i], targetDir + "\\" + toBeCopied[i], true); 
       refreshToolStripMenuItem_Click(sender, e); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message + Environment.NewLine + ex.TargetSite); 
     } 
    } 

在那裏我得到的錯誤是在File.Copy(sourceDir + "\\" + toBeCopied[i] ...的地方。

我讀過它可能是與設備映射有關的事情,但我真的不知道那是什麼。

+1

您會收到一個異常,表明File.Copy調用中使用的路徑可能存在問題。也許值得檢查傳遞給File.Copy的字符串。例如,您可以聲明一個本地字符串變量,在該字符串中組裝路徑,然後將其傳遞給File.Copy。現在你也可以用調試器檢查字符串,將它傳遞給WriteLine,將它傳遞給System.Debug等。 – 2011-06-06 21:49:13

回答

1

您不顯示toBeCopied的創建位置。看起來您可能正在運行超過click事件中設置的值的結尾,並嘗試複製一堆空名稱的文件。

你應該添加到您的單擊事件

toBeCopied = new string[listView1.SelectedItems.Count]; 

同樣的開頭(正如其他人指出的),而不是

sourceDir + "\\" + toBeCopied[i] 

你應該使用

Path.Combine(sourceDir, toBeCopied[i]) 
+0

你是對的。從你的文章和其他一些文章中,我發現設置了'toBeCopied'的邊界並且大於所選項目,所以函數接受了一個空參數。我編輯它是這樣的: 'toBeCopied = new string [listView1.SelectedItems.Count];' 這很簡單。謝謝! – 2011-06-07 14:54:51

1

假設都sourceDirtargetDir存在(可以而且應該檢查),你可能會翻倍尾\。在建立路徑時,您應該使用Path.Combine

File.Copy(Path.Combine(sourceDir, toBeCopied[i]), Path.Combine(targetDir, toBeCopied[i]), true); 
5

你可以看看在MSDN上的Path.Combine方法嗎?這將有助於確保你所有的道路都沒有多餘的地方。

Path.Combine(sourceDir, toBeCopied[i])

如果你仍然得到一個錯誤,讓我知道,如果上面的值。

2

請問目標路徑直到文件名存在? File.Copy()不會創建任何缺少的中間路徑,您需要自己做這個。使用調試器查看您要創建的源和目標路徑,並確保源存在,並且目標至少存在於目標文件的父目錄中。

0

從Henk的循環借用,但我會添加文件&目錄檢查,因爲它是未找到的路徑錯誤,需要檢查/創建OP有問題。

for (int i = 0; i < toBeCopied.Length; ++i) 
{ 
    string sourceFile = Path.Combine(sourceDir, toBeCopied[i]); 
    if(File.Exists(sourceFile)) 
    { 
     string targetFile = Path.Combine(targetDir, toBeCopied[i]); 
     if(!Directory.Exists(targetDir)) 
      Directory.CreateDirectory(targetDir); 
     File.Copy(sourceFile, targetFile, true); 
    } 
    refreshToolStripMenuItem_Click(sender, e) 
} 
相關問題