.NET基础 (14)管理文件和文件夹的类型

管理文件和文件夹的类型
1 如何操作文件和文件夹
2 如何实现文件和文件夹的监控功能

 

管理文件和文件夹的类型
1 如何操作文件和文件夹

.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:\Test\person.txt
文件扩展名是:.txt
文件夹中的子文件夹:
文件夹名为:subdic
父文件夹为:Test
文件夹创建于:2015/9/10 17:17:09
文件夹最后修改时间:2015/9/10 17:17:09
文件夹最后访问时间:2015/9/10 17:17:09
文件夹全名是:E:\Test\subdic
文件夹中的文件:
文件名为:text.txt
文件在:E:\Test\subdic
文件的长度: 0
文件创建于:2015/9/10 17:17:09
文件最后修改时间:2015/9/10 17:17:09
文件最后访问时间:2015/9/10 17:17:09
文件全名是:E:\Test\subdic\text.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\t.zip Created
文件: E:\Test\t.zip 重命名为: E:\Test\t1.zip
文件: E:\Test\t1.zip Changed
文件: E:\Test\t1.zip Deleted


转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

posted @ 2015-09-10 17:51  JesseLZJ  阅读(313)  评论(0编辑  收藏  举报