我想做一个执行此操作的C#应用程序:
非常简单,但无法让它发挥作用。
这是我的代码:
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);
}
答案 0 :(得分: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);
语句即可。此重载将无问题地覆盖目标目录中的文件。
答案 1 :(得分: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));
}
这只是直接回答问题的一个示例,但您还应该处理异常等。例如,此示例假定用户有权创建目录。此外,它假定目标目录中不存在具有相同名称的文件。您如何处理此类情况取决于您的要求。
答案 2 :(得分: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
}
我没有对此进行测试,因此可能需要进行一些修改