管理文件和文件夹的类型
1 如何操作文件和文件夹
2 如何实现文件和文件夹的监控功能
.NET内建类中提供了FileInfo和DictionaryInfo两个类型,分别用来操作文件和文件夹。有别于File和Dictionary类型。FileInfo和DictionaryInfo主要的功能在于操作文件和文件夹在文件系统中的结构,完成诸如创建、复制、读取信息、移动、判断是否存在、删除等功能。
示例:
class UseDirectoryInfo { static void Main(string[] args) { ProcessDirectory(); Console.Read(); } //操作文件夹的功能 static void ProcessDirectory() { DirectoryInfo di = null; try { //创建文件夹 di = new DirectoryInfo("E:\Test"); di.Create(); //为文件夹添加子文件夹 di.CreateSubdirectory("subdic"); //为子文件夹添加一个文件 FileInfo info = new FileInfo("E:\Test\subdic\text.txt"); using (FileStream fs = info.Create()) { } //读取文件夹信息 ReadDirectoryInfo(di); //移动文件夹 di.MoveTo("E:\Test2"); } finally { if (di != null)
{ //删除文件夹 di.Delete(true); //一起删除子文件和子文件夹,千万小心!!!
}
} } //读取文件夹状态信息的功能 static void ReadDirectoryInfo(DirectoryInfo di) { Console.WriteLine("文件夹名为:" + di.Name); Console.WriteLine("父文件夹为:" + di.Parent.Name); Console.WriteLine("文件夹创建于:" + di.CreationTime); Console.WriteLine("文件夹最后修改时间:" + di.LastWriteTime); Console.WriteLine("文件夹最后访问时间:" + di.LastAccessTime); Console.WriteLine("文件夹全名是:" + di.FullName); Console.WriteLine("文件夹中的文件:"); FileInfo[] fis = di.GetFiles(); foreach (FileInfo fi in fis) ReadFileInfo(fi); Console.WriteLine("文件夹中的子文件夹:"); DirectoryInfo[] dis = di.GetDirectories(); foreach (DirectoryInfo sdi in dis) ReadDirectoryInfo(sdi); } //读取文件状态信息的功能 static void ReadFileInfo(FileInfo fi) { Console.WriteLine("文件名为:" + fi.Name); Console.WriteLine("文件在:" + fi.DirectoryName); Console.WriteLine("文件的长度: " + fi.Length); Console.WriteLine("文件创建于:" + fi.CreationTime); Console.WriteLine("文件最后修改时间:" + fi.LastWriteTime); Console.WriteLine("文件最后访问时间:" + fi.LastAccessTime); Console.WriteLine("文件全名是:" + fi.FullName); Console.WriteLine("文件扩展名是:" + fi.Extension); } }
输出:
文件夹名为:Test
父文件夹为:E:
文件夹创建于:2015/8/16 23:58:21
文件夹最后修改时间:2015/9/10 17:17:09
文件夹最后访问时间:2015/9/10 17:17:09
文件夹全名是:E:Test
文件夹中的文件:
文件名为:person.txt
文件在:E:Test
文件的长度: 1092
文件创建于:2015/8/16 23:59:30
文件最后修改时间:2015/8/17 2:02:07
文件最后访问时间:2015/8/16 23:59:30
文件全名是:E:Testperson.txt
文件扩展名是:.txt
文件夹中的子文件夹:
文件夹名为:subdic
父文件夹为:Test
文件夹创建于:2015/9/10 17:17:09
文件夹最后修改时间:2015/9/10 17:17:09
文件夹最后访问时间:2015/9/10 17:17:09
文件夹全名是:E:Testsubdic
文件夹中的文件:
文件名为:text.txt
文件在:E:Testsubdic
文件的长度: 0
文件创建于:2015/9/10 17:17:09
文件最后修改时间:2015/9/10 17:17:09
文件最后访问时间:2015/9/10 17:17:09
文件全名是:E:Testsubdic ext.txt
文件扩展名是:.txt
文件夹中的子文件夹:
FileInfo和DictionaryInfo的操作涉及资源争用,并且不能保证文件夹或文件的存在,一般所有的操作需要包含在try、catch、finally块内。
2 如何实现文件和文件夹的监控功能
.NET提供了FileSystemWatcher类型俩实现文件系统的监控。通过控制监控目录、控制类型和回调方法,就可以方便地实现监控的功能,但需要小心FileSystemWatcher缓存溢出的情况。
FileSystemWatcher会维护一个内部缓冲来接受文件系统的修改通知,但短时间内文件系统的修改过多时,缓冲就会溢出,导致某些修改被丢失。可以通过InternalBufferSize来修改内部缓存的大小,但这对性能影响非常大,建议从加快处理速度、减小监控范围等方面来避免文件修改事件的丢失。
示例:
class UseFS_fsw { //退出程序命令 private const String Exit = "exit"; //监视的文件夹 private const String Folder = "E:\Test"; private FileSystemWatcher _fsw; public UseFS_fsw() { _fsw = new FileSystemWatcher(); //建立检测文件夹 if (Directory.Exists(Folder)) Directory.Delete(Folder, true); Directory.CreateDirectory(Folder); _fsw.Path = Folder; //这里选择最后访问文件时间、最后写文件时间、 //文件名、文件夹名变化时,触发事件 _fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; //这里选择检测所有的zip文件 _fsw.Filter = "*.zip"; //为这些事件添加处理方法。. _fsw.Changed += new FileSystemEventHandler(OnChanged); _fsw.Created += new FileSystemEventHandler(OnChanged); _fsw.Deleted += new FileSystemEventHandler(OnChanged); _fsw.Renamed += new RenamedEventHandler(OnRenamed); //这里开始所有事件会被触发 _fsw.EnableRaisingEvents = true; } //处理变化时间,变化可以包含创建、修改和删除 private void OnChanged(object source, FileSystemEventArgs e) { Console.WriteLine("文件: " + e.FullPath + " " + e.ChangeType); } //处理重命名事件 private static void OnRenamed(object source, RenamedEventArgs e) { Console.WriteLine("文件: {0} 重命名为: {1}", e.OldFullPath, e.FullPath); } static void Main(string[] args) { try { UseFS_fsw ws = new UseFS_fsw(); while (Console.ReadLine() != Exit) ; } finally { //清理测试数据 if (Directory.Exists(Folder)) Directory.Delete(Folder, true); } } }
在文件夹中创建t.zip,重命名为t1.zip,修改内容,删除,输出如下:
文件: E:Test .zip Created
文件: E:Test .zip 重命名为: E:Test 1.zip
文件: E:Test 1.zip Changed
文件: E:Test 1.zip Deleted
转载请注明出处: