我之前发布过这个问题,但不得不删除这个问题,因为我解释得太可怕了,对那些可能以前读过它的人感到抱歉。让我更清楚。我必须创建一个 winform 应用程序,允许通过指定三件事将文件从一个目录复制到另一个目录:
- 从哪里复制
(txtPath)
- 要复制的文件扩展名(您指定的是被复制的文件扩展名)
(txtExtensions)
- 复制到哪里
(txtArchiveTo)
在视觉上它看起来像这样:
从 txtPath 到 txtArchiveTo 的副本必须与它的复制方式相匹配。也就是说,如果txtPath
看起来如下所示:
c:\temp
|
-drivers.exe (file)
-log.txt (file)
-\Test1 (directory)
-\Test2 (directory)
然后,如果我选择txtArchiveTo
一个文件夹,例如c:\backup
结果应该是在我的程序运行之后,它应该如下所示:
c:\backup
|
-\temp
|
-drivers.exe (file)
-log.txt (file)
-\Test1 (directory)
-\Test2 (directory)
那就是复制的任何内容都需要遵循相同的结构...但是我很难对此进行编码,因为它看起来好像我一直在引用root.Parent.Parent
等等。让我发布一些代码:
该Go
按钮非常基本:
private void btnGo_Click(object sender, EventArgs e)
{
DirectoryInfo di = new DirectoryInfo(txtPath.Text);
WalkDirectoryTree(di);
}
这只是创建了一个 directoryinfo 对象,所以我有一个txtPath
目录句柄并调用一个函数WalkDirectoryTree
。该函数如下所示:
private void WalkDirectoryTree(DirectoryInfo root)
{
System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;
string[] extArray = txtExtensions.Text.Split(' '); //to hold the txtExtensions as an array string { "txt" "tar" "zip" etc.. }
string ext; //to hold the extension
// First, process all the files directly under this folder
try
{
files = root.GetFiles("*.*");
}
catch (UnauthorizedAccessException e)
{
throw; //todo: log this later on...
}
catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
}
if (files != null)
{
foreach (System.IO.FileInfo fi in files)
{
string extension = fi.Extension.ToString();
if (extension.IndexOf(".") > -1)
ext = extension.Substring(1, extension.Length-1);
else
ext = extension;
if (extArray.Any(s => ext.Contains(s)))
{
//copy the file
if (Directory.Exists(txtArchiveTo.Text + "\\" + fi.Directory.Name))
{
//directory exists copy the files
}
else
{
Directory.CreateDirectory(txtArchiveTo.Text + "\\" + fi.Directory.Name);
}
File.Copy(fi.FullName, txtArchiveTo.Text + "\\" + fi.Directory.Name + "\\" + fi.Name);
//create a shortcut pointing back to the file...
using (ShellLink shortcut = new ShellLink())
{
shortcut.Target = fi.FullName;
//shortcut.Description = "MY SHORTCUT";
shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal;
shortcut.ShortCutFile = fi.DirectoryName + "\\" + fi.Name + ".lnk";
shortcut.Save();
}
}
}
// Now find all the subdirectories under this directory.
subDirs = root.GetDirectories();
foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
// Resursive call for each subdirectory.
WalkDirectoryTree(dirInfo);
}
}
}
请不要太注意我创建快捷方式的代码等。那部分不是问题。我遇到的困难是当我遇到这些代码行时:
if (extArray.Any(s => ext.Contains(s)))
{
//copy the file
if (Directory.Exists(txtArchiveTo.Text + "\\" + fi.Directory.Name))
{
//directory exists copy the files
}
else
{
Directory.CreateDirectory(txtArchiveTo.Text + "\\" + fi.Directory.Name);
}
只需检查文件的if
扩展名是否与用户在其中键入的扩展名匹配,以txtExtensions
确保我们仅在找到的文件夹中复制具有这些扩展名的文件。我的问题是在那之后,如果......我不能只说:
Directory.CreateDirectory(txtArchiveTo.Text + "\\" + fi.Directory.Name);
原因是存档文件夹必须与正在复制的文件夹路径匹配。因此,例如,如果有人选择 c:\temp 来搜索和查找要复制的 txt 文件,他们选择了一个文件夹 c:\backup 来复制到并且 c:\temp 有 3 个子文件夹(一、二和三),其中还包含文本文件。结果是,在我的程序运行(“Go”完成)之后,存档文件夹 c:\backup 将包含文件夹(一、二和三),其中包含 txt 文件,此外, c:\backup\One\mytest.txt 等。
我想将它合并到我当前的代码中,并且觉得我真的很接近,但我认为我需要想出一些递归来获得正确的目录结构。请不要向我发布有关如何使用 Directory.CreateDirectory 或 FileInfo 类的 MSDN 链接,我已阅读并理解它们。