• .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: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


    转载请注明出处:

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

  • 相关阅读:
    js 的防抖与节流
    Vue---图形二维码、rules校验规则、el-dialog展示图片
    vue ----弹框
    vue的背景加载--旋转*号
    利用ES6新特性将时间戳转换为yyyy-mm-dd格式
    路由守卫之离开守卫
    Java的运行环境与开发环境
    list<map<string,object>> 按照某字段排序
    没有CSRF保护的HTML表单 漏洞解决办法
    通过mybatis-plus的分页插件,实现分页
  • 原文地址:https://www.cnblogs.com/jesselzj/p/4798692.html
Copyright © 2020-2023  润新知