6

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

当我尝试在文件资源管理器中将文件从目录复制到另一个目录时,我会收到该错误,我正在尝试自己执行此操作。它有一个用于浏览目录的树视图控件和一个用于显示目录内容的列表视图控件。这就是代码部分的样子:

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] ...

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

4

5 回答 5

5

可以看看 MSDN 上的Path.Combine方法吗?这将有助于确保您的所有整个路径都没有多余的 \'s 在它们不应该出现的地方。

IE Path.Combine(sourceDir, toBeCopied[i])

如果您仍然收到错误,请告诉我上述情况的值。

于 2011-06-06T21:48:05.733 回答
4

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

于 2011-06-06T21:53:19.953 回答
3

您没有显示在哪里toBeCopied创建。看起来您可能已经超出了 click 事件中设置的值的末尾,并试图复制一堆名称为空的文件。

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

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

也(正如其他人所指出的)而不是

sourceDir + "\\" + toBeCopied[i]

你应该使用

Path.Combine(sourceDir, toBeCopied[i])
于 2011-06-06T21:49:53.137 回答
1

假设两者都sourceDir存在targetDir(您可以并且应该检查),您可能会将尾随的\. 构建路径时,您应该使用Path.Combine

File.Copy(Path.Combine(sourceDir, toBeCopied[i]), Path.Combine(targetDir, toBeCopied[i]), true);
于 2011-06-06T21:47:52.797 回答
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)
}
于 2011-06-07T00:27:58.583 回答