如何递归地将整个目录复制并粘贴到新路径?
How to copy and paste a whole directory to a new path recursively?
我想将目录作为 copy/paste 例程移动,但要保持其结构不变。我不只是在寻找目录中所有子文件夹中的文件,然后 copy/paste 它们(作为 this 解决方案),而是我想 clone 整个事情和保持其结构不变(树 -> 子文件夹和文件),就像复制和粘贴例程一样。
所以我找到了 this 函数,可以将一个充满文件的文件夹复制到一个新路径:
Folder -> File(s)
该函数的行为与 copy/paste 例程相同。它需要 SourcePath、DestinationPath 和布尔值到 OverWriteExisting。不错,很小,但太糟糕了,它没有被标记为该问题的实际答案(推荐一个比率)。
但是如果我想移动整个目录怎么办?换句话说,如果我有一个文件夹,里面有文件夹的文件夹,文件夹的文件夹等等?也许不知道这样的文件结构树大小:
Folder -> Folder(s) -> ... -> Folder(s) -> File(s)
我正在使用以下例程 copy/paste 一个包含文件夹的文件夹。但在这里我知道我只有一层文件夹,所以只需要一个 foreach 循环:
foreach (var Folder in DestinationFolder) // here I know that I have only one level of folders to reach the files
{
CopyDirectory(FolderPath, DestinationPath, false); // use that function to copy the files
}
以上函数服务于这个目录结构:
Folder -> Folder(s) -> File(s)
我试过 this 但它没有达到我想要的效果。我只在搜索所有子文件夹时检索所有文件。这不是我想要的。我想保留子文件夹和原始结构。在这里,我得到四个文件,而不是按原样构造的目录、子文件夹及其子文件夹、子文件夹、文件。只有四个,因为它删除了我不希望发生的重复项,因为我需要所有这些。
这是我当前的结构(但我的问题对任何目录都是全局的):
Folder -> Folders -> Folders + Files
以下代码在新路径中的作用如下:
NewFolder -> AllFilesFoundInAnySubfolder
dialog.FileName = dialog.FileName.Replace(".xml", ""); // get the destination path
DirectoryInfo dirInfo = new DirectoryInfo(dialog.FileName);
if (dirInfo.Exists == false)
Directory.CreateDirectory(dialog.FileName);
List<String> EverythingInTheDirectory = Directory
.GetFiles(FileStructure.baseSessionPath + "\" + SelectedSession.Name, "*.*", SearchOption.AllDirectories).ToList(); // source
foreach (string file in EverythingInTheDirectory)
{
FileInfo mFile = new FileInfo(file);
// to remove name collusion
if (new FileInfo(dirInfo + "\" + mFile.Name).Exists == false)
mFile.MoveTo(dirInfo + "\" + mFile.Name);
}
如何移动整个未知大小的目录并保持其结构不变?不仅从目录中获取文件并移动它们!
这是一个将递归地将一个目录克隆到另一个目标目录的示例。以后在当前问题中加入你尝试过的内容,将会得到更好的回答
class Program
{
static void Main(string[] args)
{
CloneDirectory(@"C:\SomeRoot", @"C:\SomeOtherRoot");
}
private static void CloneDirectory(string root, string dest)
{
foreach (var directory in Directory.GetDirectories(root))
{
string dirName = Path.GetFileName(directory);
if (!Directory.Exists(Path.Combine(dest, dirName)))
{
Directory.CreateDirectory(Path.Combine(dest, dirName));
}
CloneDirectory(directory, Path.Combine(dest, dirName));
}
foreach (var file in Directory.GetFiles(root))
{
File.Copy(file, Path.Combine(dest, Path.GetFileName(file)));
}
}
}
我想将目录作为 copy/paste 例程移动,但要保持其结构不变。我不只是在寻找目录中所有子文件夹中的文件,然后 copy/paste 它们(作为 this 解决方案),而是我想 clone 整个事情和保持其结构不变(树 -> 子文件夹和文件),就像复制和粘贴例程一样。
所以我找到了 this 函数,可以将一个充满文件的文件夹复制到一个新路径:
Folder -> File(s)
该函数的行为与 copy/paste 例程相同。它需要 SourcePath、DestinationPath 和布尔值到 OverWriteExisting。不错,很小,但太糟糕了,它没有被标记为该问题的实际答案(推荐一个比率)。
但是如果我想移动整个目录怎么办?换句话说,如果我有一个文件夹,里面有文件夹的文件夹,文件夹的文件夹等等?也许不知道这样的文件结构树大小:
Folder -> Folder(s) -> ... -> Folder(s) -> File(s)
我正在使用以下例程 copy/paste 一个包含文件夹的文件夹。但在这里我知道我只有一层文件夹,所以只需要一个 foreach 循环:
foreach (var Folder in DestinationFolder) // here I know that I have only one level of folders to reach the files
{
CopyDirectory(FolderPath, DestinationPath, false); // use that function to copy the files
}
以上函数服务于这个目录结构:
Folder -> Folder(s) -> File(s)
我试过 this 但它没有达到我想要的效果。我只在搜索所有子文件夹时检索所有文件。这不是我想要的。我想保留子文件夹和原始结构。在这里,我得到四个文件,而不是按原样构造的目录、子文件夹及其子文件夹、子文件夹、文件。只有四个,因为它删除了我不希望发生的重复项,因为我需要所有这些。
这是我当前的结构(但我的问题对任何目录都是全局的):
Folder -> Folders -> Folders + Files
以下代码在新路径中的作用如下:
NewFolder -> AllFilesFoundInAnySubfolder
dialog.FileName = dialog.FileName.Replace(".xml", ""); // get the destination path
DirectoryInfo dirInfo = new DirectoryInfo(dialog.FileName);
if (dirInfo.Exists == false)
Directory.CreateDirectory(dialog.FileName);
List<String> EverythingInTheDirectory = Directory
.GetFiles(FileStructure.baseSessionPath + "\" + SelectedSession.Name, "*.*", SearchOption.AllDirectories).ToList(); // source
foreach (string file in EverythingInTheDirectory)
{
FileInfo mFile = new FileInfo(file);
// to remove name collusion
if (new FileInfo(dirInfo + "\" + mFile.Name).Exists == false)
mFile.MoveTo(dirInfo + "\" + mFile.Name);
}
如何移动整个未知大小的目录并保持其结构不变?不仅从目录中获取文件并移动它们!
这是一个将递归地将一个目录克隆到另一个目标目录的示例。以后在当前问题中加入你尝试过的内容,将会得到更好的回答
class Program
{
static void Main(string[] args)
{
CloneDirectory(@"C:\SomeRoot", @"C:\SomeOtherRoot");
}
private static void CloneDirectory(string root, string dest)
{
foreach (var directory in Directory.GetDirectories(root))
{
string dirName = Path.GetFileName(directory);
if (!Directory.Exists(Path.Combine(dest, dirName)))
{
Directory.CreateDirectory(Path.Combine(dest, dirName));
}
CloneDirectory(directory, Path.Combine(dest, dirName));
}
foreach (var file in Directory.GetFiles(root))
{
File.Copy(file, Path.Combine(dest, Path.GetFileName(file)));
}
}
}