1

我想做一个执行此操作的 C# 应用程序:

  1. 选择一个文件夹
  2. 将该文件夹中的所有文件复制到该文件夹​​ +/results/

很简单,但不能让它工作。

这是我的代码:

string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
        foreach (string file in files)
        {
            MessageBox.Show(Path.GetFullPath(file));
            //string path=Path.Combine(Path.GetFullPath(file), "results");
            //MessageBox.Show(path);
            string path2 = Path.GetDirectoryName(file);
            path2 = Path.Combine(Path.GetDirectoryName(file), @"results\");
            path2 = Path.Combine(path2, file);
            MessageBox.Show(path2);
        }
4

3 回答 3

6

首先,创建目标目录,如果不存在

string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);  
string destPath = Path.Combine(folderBrowserDialog1.SelectedPath, "results");
if(Directory.Exists(destPath) == false)
    Directory.CreateDirectory(destPath);

然后在你的循环内

    foreach (string file in files)  
    {  
        string path2 = Path.Combine(destPath, Path.GetFileName(file));  
        File.Move(file, path2);
    }  

请注意File.Move不能用于覆盖现有文件。
如果文件存在于目标目录中,您将收到 IOException。

如果您只想复制而不是移动,只需File.Move使用 更改语句即可File.Copy(file, path2, true);。此重载将毫无疑问地覆盖目标目录中的文件。

于 2012-06-23T16:13:11.653 回答
1

如果您尝试将文件(而不是复制它们)移动到新的子文件夹,那么...

DirectoryInfo d = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
foreach (FileInfo f in d.GetFiles())
{
    string fold = Path.Combine(f.DirectoryName, @"results\");

    if (!Directory.Exists(fold))
        Directory.CreateDirectory(fold);

    File.Move(f.FullName, Path.Combine(fold, f.Name));
}

这只是一个直接回答问题的示例,但您还应该处理异常等。例如,此示例假定用户将有权创建目录。此外,它假定目标目录中不存在同名的文件。您如何处理此类情况取决于您的要求。

于 2012-06-23T17:07:07.930 回答
0

如果要重定位整个目录,可以使用Directory.Move来实现这一点。

string path1 = Path.GetDirectoryName(file);
string path2 = Path.Combine(Path.GetDirectoryName(file), @"results\");
Directory.Move(path1, path2);

或者,如果您只想复制文件夹(不删除第一个目录),则需要手动进行。

string path1 = Path.GetDirectoryName(file);
string path2 = Path.Combine(Path.GetDirectoryName(file), @"results\");

foreach(var file in Directory.GetFiles(path1))
{
    File.Copy(file, Path.Combine(path2, file));
    // File.Move(file, Path.Combine(path2, file)); // use this to move instead of copy
}

我没有对此进行测试,因此可能需要进行一些修改

于 2012-06-23T16:12:51.577 回答