下面我们讲流与 I/O。
流与输入/输出呢,是程序设计里面相当重要的一个环节。
因为我们信息呢最终是要永久性地保留,那么总是存到了 输入/输出设备。
那在 .NET 里面呢,它是用 System.IO
这个名字空间来表示的,在这个名字空间里头呢,提供了很多用于文件
以及数据流进行读写操作的这些类。
那这个类呢,大体分两大类,一类呢是关于流,也就是 Stream。
Stream 呢实际上是对这个信息的流的一个
抽象,也就是我们所有的包括文件,包括到内存,
包括到网络,它都把它抽象为流,也就是这些输入/输出呢都 叫流,Stream。
那这种流呢,按位置来分呢,它可以分成是 File
就是文件的,MemoryStream 呢就是内存流, BufferedStream
呢它实际上相当一种过滤流,或者说中间有缓冲的一个流。
另外流呢,它根据
它的对于内容的区分,那么又分成了一个 二进制和文本的,BinaryReader
和 BinaryWriter,它是呢 进行二进的信息的。
然后 TextReader 和 TextWriter 呢 它是对文本呢进行读和写。
那么 StreamReader 和 StreamWriter,
还有一个呢,String 就是字符串,
从里面,从字符串里面读,或者向字符串里面写, 就叫 StringReader
或 Writer,也就是说它是通过内容来进行区分。
那么这两个呢,一类呢是指向所最终的位置,包括文件呐,网络等等;
另外一类呢,它是指向的是它的 信息的读取。
所以这两类之间的关系呢,是靠这个 包装,那这里呢比如说有一个
FileStream,文件流,这个文件流呢 这个对象是某个文件,然后呢它的状
态,存取状态呢是创建一个文件流。
如果我们要把它当成二、 当成二进制,或者当成一个 Reader 或者
Writer, 那我们就可以把这个 FileStream 包装起来,
生成一个 StreamWriter,也就是说一个是
最终位置,我们实际上把它叫节点流,一个呢是处理 读写,这两个呢是一个包装的关系。
所以这一大类呢,实际上是关于内容的一个处理,我们统称为流。
除了流以外呢,还有一类呢是关 于这个文件或者目录操作的这些类。
这些类呢,实际上是对文件和目录呢, 或者叫文件夹的总体操作。
也就是说一个是总体操作, 一个是呢内容的读写。
那我们先看一下文件和文件夹的一个总体的一个管理。
那文件和文件夹里面呢,主要有这 么几类,一类是 FileInfo
和 File,是对文件进行管理的; 第二类呢是 DirectoryInfo
和 Directory,这类呢是对于目录,或者叫文件夹的一种管理,
因为早期呢,我们都把文件夹叫做目录,或者叫 Directory; 然后还有一类呢,叫
FileSystemInfo,这个 FileSystemInfo
呢,它是文件和目录信息的一个父类, 它就是文件信、 文件信息、
文件系统信息类; 还有一个使用工具类,Path
是专门管理这个路径的拆分,或者路径的查找,所以路径的这个 管理。
那么显示文件和文件夹呢 是用
FileInfo 和 DirectoryInfo 这两个类。
这两个类呢,它是 一个,可以 new 一个这个实例,new 一个这样的实例。
那么这个实例对象呢,它可以 new 了这样一个实例对象,它就可以取得
这个文件相关的文件名、 文件大小、 文件的
时间等等,还有属性,所以它相关的信息都能取到。
另外一个是 DirectoryInfo 呢也是一样的,也可以取得这个文件的相关的信息,
文件夹的,包括它所在的父、 父文件夹等等。
文件的 新建、 复制、
移动和删除,那这种呢它 没有一个,没有具体的这个类,它可以用
File 和 Directory 这个的 static 方法。
请大家注意呢,刚才的 FileInfo 它是一个实例,就是 new 一个实例。
这个 File 呢 它所有的方法都是 static 的,所以你看
File .Create、 File.Copy、 File.Move 等等。
那文件夹也是一样的,文件夹可以创建一个文件夹啊,或者移动啊,包括
移动和删除,然后判断是否存在。
比较重要的一个呢就是 GetDirectories,得到它的子文件夹
和 GetFiles,得到这个文件夹下面的所 有的文件。
有了这个呢,我们就 可以呢获取文件和文件夹相应的信息,
所以这个是 GetDirectories 和 GetFiles。
得到的对象呢,它又是一个,啊是一个数组, 所以我们可以呢通过
Directory 的静态方法。
那么 Path 呢,它提供的呢是 路径,包括这个扩展名,得到扩展名,
得到全路径等等,这个因为这些具体的方法呢,我们就
不一个个地去详细说了,大家呢可以查看那个 API
的这个 文档,也就是 MSDN 这个文档 可以看。
那下面我们举一个例子,叫 ListAllFiles,
啊列出文件夹及其子文件夹下面的所有文件。
那这个程序呢,显然它是一个递归的一个程序。
我们看一下这个例子,我们叫 ListFiles。
ListFiles 这里面呢,带的一个参数是
File SystemInfo,这个呢它既包括文件,也包括目录。
然后我们在这个程序里头呢做的工作就是 首先判断它是否存在,用这个
Info 的 Exists,啊这个是否存在,如果不存在呢,直接返回。
那下面呢,我们把它 as,当 成一个文件信息。
我们知道这个 FileSystemInfo 呢 既可以是文件,又可以子目录,所以我们先
as 一个,那么 as 呢这种算法呢就是 把它当成一个,当成如果它
有点像强制类型转换,但是如果转换不了,它是 null,那么 那就不处理。
然后下面呢,我们已经知道它是一个 这个文件夹
GetFileSystemInfo,那么得到的是一个数组,这个数组呢又是一个 FileSystemInfo。
但这个数组里面,我们下面呢又是
针对每一个信息呢,看它是不是文件信息,如果是的话,
就显示它的文件名,如果不是的话, 那它就是目录,那这个目录呢,我们又递归地去调用,
目录递归地调用,所以这就是关于呢文件和文件夹。
关于文件和文件夹呢 还有一点我可以说明一下,就是一个如果我们在
WinForm 当中设计程序,那么它在工具箱里面呢,这里面呢
有一个对话框这个类别,那这里面呢就有一个 File (口误,应为
Show) Dialog,就是有一个打开文件对话框和关闭文件对话框。
那么这个对话框对象呢,我们把它放在界面上,它平时是不显示出来的, 它需要用呢
ShowDialog 来打开,然后打开完了以后呢,用户就选文件,选完以后呢
这个 ShowDialog 呢结束以后呢,我们就可以用 GetSelected Folder
或者 GetFile 来得到用户选择的结果, 这个用起来还是比较方便的。
那这个对话框呢,它是在 啊这个工具箱的对话框里头有一个, 有一个叫做
OpenFileDialog 和 SaveFileDialog。
如果我们要打开文件,那你就用 OpenFileDialog,把它拖到窗体上面,
拖到窗体上以后呢,注意它这个是放到这、 这个界面的下面的,也就是它是属于一个,
它属于一个组建,那我们在用的时候 呢,就要用这个对象点 ShowDialog。
还有一个也比较重要,叫做 FileSystemWatcher 这个类, 它实际上呢是文件系统的监视类。
这个监视类呢,它给了一系列的这个事件,
它可以监视呢这个文件被删除了,或者呢更名了,或者创建了, 所以这些事件呢,我们都可以
+ =,所以它提供了这样一个很好的一个 啊工具,然后我们可以很方便地来监视这些文件
是否被删除了等等,进行、 是否进
行了更改,所以这个使用也是很方便的,我们看一个例子。
啊这是 我们
new了一个 SystemWatcher,这个 Watcher.Path 等于一个路径。
然后 Filter 呢它只关注什么什么样的文件,*.txt。
然后在这里呢,对这个 Watcher 要, 要对这个
NotifyFilter 进行设置,就是对什么样的 这个事件进行通知。
如果你不设置呢,这下面呢 + = 一个事件呢,是没有意义的,它不、
它不发生所以,那么 + = 这个事件,这个事件里面我们就可以写
我们想做的事情,但是现在这里呢 就是写了一个
OnChanged,然后把这个相关的信息呢显示出来。
所以这个 Watcher 类呢,用起来也是相当方便。