初次接触到IO流,根据书本上的知识,加上自己的摸索,发现了一些好玩的事情.(书本上的知识或多或少,有时候不足以解决我们的问题!这时候我们就应该自己去求解!!!
所以我们学习的时候要抱有探索的精神,求知若渴是帮助我们获取更多知识的一种积极的精神态度,需要保持)
该项目主要是为了加载电脑磁盘中存在的所有文件夹和文件(directory,file)
这时候我遇到了第一个问题:书本上只有将指定的磁盘设为根节点,在窗体TreeView中添加该磁盘中的文件夹
(我去,那如果我的电脑上分了几十个磁盘分区,那我不得全指定了?我觉得微软肯定不会这么二,肯定有关于所有磁盘的类.
Disk是磁盘的意思,我就试了试,结果 = = 没有这个类,你妹的,我只好慢慢来)
然后就有了
1 private void GetDirectoryInDisk() 2 { 3 DriveInfo[] allDisk = System.IO.DriveInfo.GetDrives(); 4 foreach (DriveInfo item in allDisk) 5 { 6 7 TreeNode treeNode = new TreeNode(); 8 treeNode.Text = item.Name; 9 treeNode.Tag = item; 10 tvAllDirectoryInfo.Nodes.Add(treeNode); 11 DirectoryInfo directory = item.RootDirectory; 12 //获取驱动器下所有的文件夹信息 13 DirectoryInfo[] allDirectory = directory.GetDirectories(); 14 foreach (DirectoryInfo dir in allDirectory) 15 { 16 TreeNode subTreeNode = new TreeNode(); 17 subTreeNode.Text = dir.Name; 18 subTreeNode.Tag = dir; 19 treeNode.Nodes.Add(subTreeNode); 20 } 21 22 } 23 }所有磁盘为根节点
结果华丽丽的爆了个这么个错误
(当时就有种去你妹的冲动,静下心来有发现了磁盘类型)
1 // 摘要: 2 // 定义驱动器类型常数,包括 CDRom、Fixed、Network、NoRootDirectory、Ram、Removable 和 Unknown。 3 [Serializable] 4 [ComVisible(true)] 5 public enum DriveType 6 { 7 // 摘要: 8 // 驱动器类型未知。 9 Unknown = 0, 10 // 11 // 摘要: 12 // 此驱动器没有根目录。 13 NoRootDirectory = 1, 14 // 15 // 摘要: 16 // 此驱动器是一个可移动存储设备,如软盘驱动器或 USB 闪存驱动器。 17 Removable = 2, 18 // 19 // 摘要: 20 // 此驱动器是一个固定磁盘。 21 Fixed = 3, 22 // 23 // 摘要: 24 // 此驱动器是一个网络驱动器。 25 Network = 4, 26 // 27 // 摘要: 28 // 此驱动器是一个光盘设备,如 CD 或 DVD-ROM。 29 CDRom = 5, 30 // 31 // 摘要: 32 // 此驱动器是一个 RAM 磁盘。 33 Ram = 6, 34 }磁盘类型
我就增加了一道判断解决了这个问题(学校的一个磁盘是虚拟光驱,产生了设备未就绪的问题)
1 foreach (DriveInfo item in allDisk) 2 { 3 if (item.DriveType == DriveType.Fixed) 4 { 5 TreeNode treeNode = new TreeNode(); 6 treeNode.Text = item.Name; 7 treeNode.Tag = item; 8 tvAllDirectoryInfo.Nodes.Add(treeNode); 9 DirectoryInfo directory = item.RootDirectory; 10 //获取驱动器下所有的文件夹信息 11 DirectoryInfo[] allDirectory = directory.GetDirectories(); 12 foreach (DirectoryInfo dir in allDirectory) 13 { 14 TreeNode subTreeNode = new TreeNode(); 15 subTreeNode.Text = dir.Name; 16 subTreeNode.Tag = dir; 17 treeNode.Nodes.Add(subTreeNode); 18 } 19 } 20 }修改
文件夹是没办法跨磁盘移动的,如果要移动只能在同一驱动器下!
1 private void CopyDirectory(string srcdir, string desdir) 2 { 3 string folderName = srcdir.Substring(srcdir.LastIndexOf("//") + 1); 4 5 string desfolderdir = desdir + "//" + folderName; 6 7 if (desdir.LastIndexOf("//") == (desdir.Length - 1)) 8 { 9 desfolderdir = desdir + folderName; 10 } 11 string[] filenames = Directory.GetFileSystemEntries(srcdir); 12 13 foreach (string file in filenames)// 遍历所有的文件和目录 14 { 15 if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件 16 { 17 18 string currentdir = desfolderdir + "//" + file.Substring(file.LastIndexOf("//") + 1); 19 if (!Directory.Exists(currentdir)) 20 { 21 Directory.CreateDirectory(currentdir); 22 } 23 24 CopyDirectory(file, desfolderdir); 25 } 26 27 else // 否则直接copy文件 28 { 29 string srcfileName = file.Substring(file.LastIndexOf("//") + 1); 30 31 srcfileName = desfolderdir + "//" + srcfileName; 32 33 34 if (!Directory.Exists(desfolderdir)) 35 { 36 Directory.CreateDirectory(desfolderdir); 37 } 38 39 40 File.Copy(file, srcfileName); 41 } 42 }//foreach 43 }文件或文件夹复制
使用递归操作.
这个小项目到这里就告一段落了,要学习的东西还有很多,继续努力.