zoukankan      html  css  js  c++  java
  • C#之IO类库(一)——操作文件系统

    C#的IO类库提供了丰富的IO操作,下面我来总结一下其IO类库提供的一些操作文件系统的方法

    一.操作驱动器
    C#用DriveInfo来操作驱动器
    1.创建对象
    a.我们可以通过静态方法DriveInfo.GetDrives()来获取所有的Driver。
    b.可以以Drive Letter为参数新建DriveInfo对象,注意DNS路径不能作为参数。
    c.此外,我们还可以通过Directory.GetLogicalDrives()先获取机器上所有Driver的Driver letter,再用它新建DriveInfo对象以操作所有的Driver。

    2.获取驱动器的状态
    我们通过DriveInfo对象来获取驱动器的状态,可以获取的状态有
    AvailableFreeSpace:获取当前用户被分配的可用空间大小(bytes)
    TotalFreeSpace:获取所有可用空间大小(bytes)
    TotalSize:获取总大小(bytes)
    DriveFormat:返回FAT, NTFS等值
    DriveType:返回DriveType类型的Enum值,可以是CDRom, Fixed, Network, NoRootDirectory, Ram, Removable,或者Unknown
    IsReady:对Removable和CD-ROM来说只有相应的设备可以访问了才返回true,当该属性为false时,很多其他属性无法获取
    Name:盘符名
    RootDirectory:返回Driver所代表的路径的Directory对象。
    VolumeLabel:返回VolumeLabel信息,VolumeLabel就是咱自己对盘符定义的名字

    二.操作文件夹
    C#提供了DirectoryInfo和Directory两个类来操作文件夹,这两个类提供了很多相同的方法,他们的区别在于DirectoryInfo是先构造一个文件夹对象,再对这个对象进行操作。而Directory提供的大多数都是静态函数,这样能够直接根据给定的文件夹路径进行相应的操作。在对文件夹进行多个操作时最好用DirectoryInfo,而只进行一个操作,最好用Directory。
    1.构造对象
    DirectoryInfo需要先构造文件夹对象,再获取文件夹属性,或者对文件夹进行操作。它的构造方法不负责判断路径是否存在。
    Directory不需要构造文件夹对象,直接传入文件夹的路径进行操作

    2.判断文件夹是否存在
    DirectoryInfo对象可通过查看Exists属性查看文件夹是否存在
    Directory可通过Exists方法查看文件夹是否存在

    3.获取文件夹属性
    注意,在用DirectoryInfo和Directory类获取文件夹属性前最好先判断其是否存在
    对DirectoryInfo对象,在获取文件夹属性前应先用refresh函数刷新,可以访问文件夹的下列属性:
    Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值
    CreationTime
    CreationTimeUtc
    LastAccessTime
    LastAccessTimeUtc
    LastWriteTime
    LastWriteTimeUtc

    Directory也可获取上述属性,不过是用静态函数获取,另外Directory也不支持获取Attribute。
    SetCreationTime
    SetCreationTimeUtc
    SetLastAccessTime
    SetLastAccessTimeUtc
    SetLastWriteTime
    SetLastWriteTimeUtc
    GetCreationTime
    GetCreationTimeUtc
    GetLastAccessTime
    GetLastAccessTimeUtc
    GetLastWriteTime
    GetLastWriteTimeUtc

    4.路径操作
    DirectoryInfo和Directory类都支持路径操作,这些操作只针对传入的路径字符串,和文件夹是否存在无关
    DirectoryInfo有下面一些属性
    Name
    Extension
    FullName
    Parent
    Root

    Directory有下面一些方法
    GetParent:获取父目录的DirectoryInfo对象
    GetDirectoryRoot

    5.新建,移动,删除文件夹
    DirectoryInfo和Directory类都支持文件夹的新建,移动,删除
    DirectoryInfo的方法
    Create,CreateSubdirectory,Delete,MoveTo

    Directory的方法
    CreateDirectory
    Delete  
    Move

    6.遍历文件夹下的内容
    DirectoryInfo和Directory类都支持遍历文件夹下的内容,而且都支持通过传入searchpattern和searchOption来定义遍历的行为,对于searchpattern,*匹配一个或多个字符,?匹配一个字符。searchOption的值是TopDirectory或AllDirectories,用来控制匹配的时候要不要包括子目录。
    DirectoryInfo的方法:
    EnumerateDirectories
    EnumerateFiles
    EnumerateFileSystemInfos
    GetDirectories
    GetFiles
    GetFileSystemInfos

    Directory的方法
    GetDirectories
    GetFiles
    GetFileSystemEntries
    EnumerateDirectories
    EnumerateFiles
    EnumerateFileSystemEntries

    7.获取和设置当前的工作路径
    Directory有两个重要的方法:
    GetCurrentDirectory:获取当前的工作路径
    SetCurrentDirectory:设置当前的工作路径

    三.操作文件
    C#提供了FileInfo和File两个类来操作文件,这两个类提供了很多相同的方法,他们的区别在于FileInfo是先构造一个文件对象,再对这个对象进行操作。而File提供的大多数都是静态函数,这样能够直接根据给定的文件路径进行相应的操作。在对文件进行多个操作时最好用FileInfo,而只进行一个操作,最好用File。
    1.构造对象
    FileInfo需要先构造文件对象,再获取文件属性,或者对文件进行操作。它的构造方法不负责判断路径是否存在。
    File不需要构造文件对象,直接传入文件的路径进行操作

    2.判断文件是否存在
    FileInfo对象可通过查看Exists属性查看文件是否存在
    File可通过Exists方法查看文件是否存在

    3.获取文件属性
    注意,在用FileInfo和File类获取文件属性前最好先判断其是否存在
    对FileInfo对象,在获取文件属性前应先用refresh函数刷新,可以访问文件的下列属性:
    Attributes:archive, compressed, directory, hidden, offline, read-only, system, 和temporary的或值
    CreationTime
    CreationTimeUtc
    LastAccessTime
    LastAccessTimeUtc
    LastWriteTime
    LastWriteTimeUtc
    Length:文件大小
    IsReadOnly


    File也可获取上述属性,不过是用静态函数获取
    GetAttributes
    SetAttributes
    SetCreationTime
    SetCreationTimeUtc
    SetLastAccessTime
    SetLastAccessTimeUtc
    SetLastWriteTime
    SetLastWriteTimeUtc
    GetCreationTime
    GetCreationTimeUtc
    GetLastAccessTime
    GetLastAccessTimeUtc
    GetLastWriteTime
    GetLastWriteTimeUtc

    4.路径操作
    FileInfo提供了一些路径操作,这些操作只针对传入的路径字符串,和文件是否存在无关
    FileInfo有下面一些属性
    Name
    Extension
    FullName
    Directory:返回DirectoryInfo对象
    DirectoryName
    Parent
    Root

    5.新建,移动,删除文件
    FileInfo和File类都提供了新建,移动,删除文件操作
    FileInfo的方法:
    CopyTo
    Create
    Delete
    MoveTo
    Replace

    File的方法
    Copy
    Create
    Delete
    Move
    Replace

    6.加密解密文件
    FileInfo和File类都提供了Encrypt和Decrypt方法用来加密和解密文件,用某个用户加密的文件只有同一个用户能解密

    四.监听文件夹
    C#有个很有趣的类,FileSystemWatcher,这个类可以用来监听文件夹内文件的增加,删除,修改等事件。
    1.定制监听的信息
    通过设置FileSystemWatcher的一些属性来定制监听的信息
    Path:监听的目录
    NotifyFilter:用来设置对哪些类型的更改进行监视
    监视的类型为FileName,DirectoryName,Attributes,Size,LastWrite,LastAccess,CreationTime,Security的或值。默认为LastWrite, FileName, DirectoryName的或值
    InternalBufferSize:内部缓存区的大小,默认8KB,最小4KB,最大64KB
    Filter:可以用通配符过滤文件,*匹配一个或多个字符,?匹配一个字符
    IncludeSubdirectories:是否监听子目录

    2.定制事件发生后的行为
    文件夹里会发生下述事件
    Changed
    Created
    Deleted
    Renamed
    我们通过给这些事件加事件处理器来处理事件
    另外还可以用WaitForChanged来监听某个指定类型的消息然后返回

    3.启动监听
    只有当EnableRaisingEvents为true且Path有值时,才能监听成功,当我们将所有信息设置好后,就可以通过设置这个值启动和停止监听了

    4.用BeginInit和EndInit来阻止component在初始化完成前使用,一般将一系列的操作写在这两个函数之间。

    5.在Form中定义的时候必须将Form控件赋给SynchronizingObject属性

    6.简单的示例:

    监听"C:\jingle"文件夹下面所有文件和文件夹的重命名操作

     [PermissionSet(SecurityAction.Demand, Name="FullTrust")]
        public static void Run()
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            watcher.Path = "c:\\jingle";
            watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName;
            watcher.IncludeSubdirectories = true;
            watcher.Filter = "*.*";
    
            watcher.Renamed += new RenamedEventHandler(OnRenamed);
    
            watcher.EnableRaisingEvents = true;
    
            Console.Read();
        }
    
        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath);
        }


    作者:Jingle Guo
    出处:http://www.cnblogs.com/studynote/
    若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    c++中的工具(一):std::pair<class T1, class T2>
    mybatisplus Lambda 表达式
    将查询结果映射成map的注解,其中第一个字段为key,第二个字段为value.
    mybatisplus 添加 /修改 数据 插入公共字段
    mybatisplus扩展BaseMapper的方法(InsertBatchSomeColumn及AlwaysUpdateSomeColumnById)
    根据俩日期(yyyy-MM-dd)格式获取它们之间的年月日组合结果(js实现)
    oralce json字段中根据key提取value的函数(转载)
    记录一下关于oracle还原数据库的问题
    记录一下数据库外连接 的不同
    JAVA项目从运维部署到项目开发(六. Jenkins之静态页面(2))
  • 原文地址:https://www.cnblogs.com/studynote/p/3009309.html
Copyright © 2011-2022 走看看