利用递归处理文件夹拷贝功能
递归:
一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数);通俗来讲就是一个函数可以调用函数本身。下面通过一个文件夹的拷贝功能来阐述
- 需求
实现一个简单的文件夹拷贝功能(文件夹下存在子目录文件夹),拷贝后的文件结构不变;
- 界面
源文件(左)结构如下:
后台代码:
1 public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 } 7 8 private void buttonEdit_ButtonClick(object sender, ButtonPressedEventArgs e) 9 { 10 ButtonEdit bte = (ButtonEdit)sender; 11 12 FolderBrowserDialog fbd = new FolderBrowserDialog(); 13 14 if (fbd.ShowDialog() == DialogResult.OK) 15 { 16 if (bte == btnSource) 17 this.btnSource.Text = fbd.SelectedPath; 18 else 19 this.btnTarget.Text = fbd.SelectedPath; 20 target = btnTarget.Text; 21 source = btnSource.Text; 22 } 23 } 24 25 /// <summary> 26 /// 源文件夹路径 27 /// </summary> 28 private string source { set; get; } 29 30 /// <summary> 31 /// 目标文件夹路径 32 /// </summary> 33 private string target { set; get; } 34 35 private void btnCopy_Click(object sender, EventArgs e) 36 { 37 MoveFolder(source, target); 38 txtlog.AppendText("拷贝成功!"); 39 } 40 41 private void MoveFolder(string sourceFolder, string destFolder) 42 { 43 //检查是否存在目标目录 44 if (!Directory.Exists(destFolder)) 45 { 46 Directory.CreateDirectory(destFolder); 47 } 48 49 //第一步先获取文件夹 50 DirectoryInfo info = new DirectoryInfo(sourceFolder); 51 52 //获取文件下的所有文件 53 FileInfo[] files = info.GetFiles(); 54 foreach (FileInfo file in files) 55 { 56 file.CopyTo(destFolder + "\\" + file.Name, true); 57 txtlog.AppendText("正在拷贝文件: " + file.FullName + "\r\n"); 58 } 59 60 //文件夹 61 FileSystemInfo[] fsi = info.GetFileSystemInfos(); 62 63 foreach (FileSystemInfo item in fsi) 64 { 65 if (string.IsNullOrEmpty(item.Extension)) 66 { 67 //利用递归处理 68 MoveFolder(item.FullName, destFolder + GetFolderName(item.FullName)); 69 } 70 } 71 } 72 73 /// <summary> 74 /// 获取源文件所在文件夹 75 /// </summary> 76 /// <param name="sourceFolder"></param> 77 /// <returns></returns> 78 private string GetFolderName(string sourceFolder) 79 { 80 string[] strs = sourceFolder.Split(new char[] { '\\' }); 81 //获取源文件名 82 return "\\" + strs[strs.Count() - 1]; 83 } 84 }
目标文件夹结构: