复制文件时“无法找到路径的一部分”错误

时间:2011-06-06 21:41:07

标签: c# path file-copying

我已经在互联网上搜索了这个,仍然没有找到解决方案。作为一个终极尝试,我希望有人能给我一个确切的答案。

当我尝试在文件资源管理器中将文件从目录复制到另一个文件时,我遇到了这个错误。我正在尝试自己做。它有一个用于浏览目录的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] ...

我读过它可能与设备的映射有关,但我真的不知道那是什么。

5 个答案:

答案 0 :(得分:5)

您可以查看MSDN上的Path.Combine方法吗?这将有助于确保您的整个路径都没有多余的路径。

即。 Path.Combine(sourceDir, toBeCopied[i])

如果您仍然收到错误,请告诉我上述内容的价值。

答案 1 :(得分:3)

您不会显示创建toBeCopied的位置。看起来您可能已经超过了click事件中设置的值的末尾,并尝试复制一堆空名称的文件。

您应该将其添加到点击事件的开头

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

另外(正如其他人所说)而不是

sourceDir + "\\" + toBeCopied[i]

你应该使用

Path.Combine(sourceDir, toBeCopied[i])

答案 2 :(得分:2)

目标路径是否存在文件名? File.Copy()不会创建任何缺少的中间路径,您需要自己执行此操作。使用调试器查看您正在创建的源路径和目标路径,并确保源存在且目标至少存在于目标文件的父目录中。

答案 3 :(得分:1)

假设sourceDirtargetDir都存在(您可以并且检查),您可能会加倍追踪\。构建路径时,应使用Path.Combine

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

答案 4 :(得分:0)

借用Henk的循环,但我要添加文件&amp;目录检查,因为路径未找到错误需要检查/创建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)
}