C#从入门到精通(第四版)学习记录-- 第20章(文件及数据流技术))
第二十章 文件及数据流技术
20.1 System.IO命名空间
System.IO命名空间包含允许在数据流和文件上进行同步和异步读取及写入的类型。
文件:一些具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合;
流:提供一种向后备存储写入字节和从后备存储读取字节的方式;
System.IO 命名空间中的类及说明:
20.1.1 File类 和 FileInfo类
File类和FileInfo类都是用来操作文件的,许多方法调用相同,可以判断文件是否存在、创建、复制、删除、移动、打开文件及获取文件基本信息等。
- File类中的方法都是静态的,而 FileInfo类没有静态方法仅可以用于实例化对象;
- File类中所有方法都是静态的,它的调用需要字符串参数为每一个方法调用规定文件的位置;
- 若只执行一个操作,使用File类中方法效率更高,因为.NET框架不必执行实例化对象并调用其他方法的过程;
- 若多次重用某个对象,使用FileInfo类中的方法效率高,因为不需要每次都要寻找文件(File类每次都需要寻找文件);
- 需要添加System.IO命名空间;
bool bRet = File.Exists("D:\\test.xml"); //true:存在 false:不存在
FileStream fs = File.Creat(D:\\test.xml”) //创建文件
FileInfo info = new FileInfo("D:\\text.xml"); //实例化
bool bRet1 = info.Exists; //true:存在
FileStream fs1 = info.Creates(); //创建文件
20.1.2 Directory类和DirectorInfo类
Directory类和DirectoryInfo类都是用来对目录进行操作的,两个类中许多方法调用都是相同的,可以判断目录是否存在、创建、复制、移动、删除目录和子目录等。
- Directory类,对文件夹进行操作时,其文件夹的路径必须正确,否则会触发异常。
bool bRet = Directory.Exists("D:\\test\\"); //文件夹是否存在
DirectoryInfo dInfo = Directory.CreateDirectory("D:\\test\\"); //创建文件夹
20.2. 文件操作
20.2.1 判断文件是否存在
- File类的Exists方法
public static bool Exists(string path);
bool bRet = File.Exists("D:\\test.xml"); //true:存在 false:不存在
// path: 要检查的文件,若path为空引用或零长度字符串,返回false;
//返回值: 有权限要求(非只读属性)且存在此文件,则为true,否则为false;
- FileInfo类的Exists方法
public override bool Exists{get;}
FileInfo info = new FileInfo("D:\\text.xml"); //实例化
bool bRet = info.Exists; //true:存在
//若文件存在,返回true;若不存在或该文件是目录,返回false;
20.2.2 创建文件
- File类中的Create方法,若路径为空或文件夹是只读属性,会触发异常。
public static FileStream Create(string path);
public static FileStream Create(string path, int bufferSize);
public static FileStream Create(string path, int bufferSize, FileOptions options);
public static FileStream Create(string path, int bufferSize, FileOptions options, FileSecurity fileSecurity);
- FileInfo类的Create方法
public FileStream Create();
//默认情况下,该方法将向所有用户授予对新文件的完全读写访问权限。
20.2.3 复制或移动文件
- File类的Copy方法
public static void Copy(string sourceFileName, string destFileName);
//sourceFileName:要复制的文件
//destFileName: 目标文件的名称,不能是目录,该参数不能是现有文件
public static void Copy(string sourceFileName, string destFileName, bool overwrite);
//sourceFileName:要复制的文件
//destFileName: 目标文件的名称,不能是目录,可以是现有文件
//overwrite: 如果需要覆盖原来的文件,写为true,否则应写为false
File.Copy("D:\\text.xml", "D:\\text1.xml");
File.Copy("D:\\text.xml", "D:\\text1.xml",true);
- File类的Move方法,将指定文件移动到新位置,若目标文件已存在,会发生异常
public static void Move(string sourceFileName, string destFileName);
//sourceFileName:要移动的文件
//destFileName: 文件的新路径
File.Move("D:\\text.xml", "D:\\text1.xml");
- FileInfo类的CopyTo方法
public FileInfo CopyTo(string destFileName);
public FileInfo CopyTo(string destFileName, bool overwrite);
//destFileName:要复制到的新文件名称
//overwrite: 如果需要覆盖原来的文件,写为true,否则应写为false
//第一种重载形式的返回值为带有完全限定路径的新文件;
//第二种重载形式的返回值为新文件,或若overwrite为true,则为现有文件的改写。
//若文件存在,且overwrite为false,会发生异常。
FileInfo info = new FileInfo("D:\\text.xml");
info.CopyTo("D:\\text1.xml");
- FileInfo类的MoveTo方法,若目标文件已存在,会发生异常
public void MoveTo(string destFileName);
//destFileName:要复制到的新文件名称
FileInfo info = new FileInfo("D:\\text.xml");
info.MoveTo ("D:\\text1.xml");
20.2.4 删除文件
- File类的Delete方法
public static void Delete(string path)
//如果当前删除的文件正在使用,则删除时会发生异常。
File.Delete("D:\\text.xml");
- FileInfo类的Delete方法
public override void Delete()
FileInfo info = new FileInfo("D:\\text.xml");
info.Delete();
//需要去只读属性,否则抛异常
20.2.5 获取文件的基本信息
主要用FileInfo类中的各种属性。
FileInfo info = new FileInfo("D:\\text.xml");
info.CreationTime.ToShortDateString(); //文件创建时间 2022-12-21
info.LastAccessTime.ToShortDateString(); //上次访问该文件的时间 2022-12-21
info.LastWriteTime.ToShortDateString(); //上次写入文件的时间 2022-12-21
string szNmae = info.Name; //文件名称 text.xml
string szFNmae = info.FullName; //文件完整目录 D:\\text.xml
string szDNmae = info.DirectoryName; // 文件完整路径 D:\\
string szIsRead = info.IsReadOnly.ToString(); //是否是只读 false
long lLength = info.Length; //文件长度 15
20.3 文件夹的基本操作
文件夹的基本操作大体有:判断文件夹是否存在、创建文件夹、移动文件夹、删除文件及遍历文件夹中的文件。
20.3.1 判断文件夹是否存在
- Directory类的Exists方法
public static bool Exists(string path);
//path: 要检查的文件
//返回值:若目录存在,则为true,否则为false;
//允许path参数指定相对或绝对路径信息。相对路径信息被解释为相对于当前的工作目录
bool bRet = Directory.Exists("D:\\test "); //true:存在 false:不存在
- DirectoryInfo类的Exists方法
public override bool Exists{get;}
//若目录存在,返回true;若不存在或该文件是目录,返回false;
DirectoryInfo info = new DirectoryInfo ("D:\\text "); //实例化
bool bRet = info.Exists; //true:存在
20.3.2 创建文件夹
- Directory类中的CreatDirectory方法,若路径存在或path的某些部分无效时,会触发异常。
public static DirectoryInfo CreatDirectory(string path);
public static DirectoryInfo CreatDirectory(string path, DirectorySecurity directorySecurity);
//path:目录路径
//directorySecurity: 要应用于此目录的访问控制
Directory. CreatDirectory(“D:\\test”);
- DirectoryInfo类的Create方法
public void Create();
public void Create(DirectorySecurity directorySecurity);
20.3.3 移动文件夹
需要统一磁盘跟目录,如C盘下的文件夹只能移动到C盘中的某个文件夹下。
- Directory类中的Move方法
public static void Move(string sourceDirName,string destDirName);
//sourceDirName: 要移动的文件或目录的路径
//destDirName:指向sourceDirName的新位置的路径
Directory. Move("D:\\test","D:\\test1");
- DirectoryInfo类的MoveTo方法
public void MoveTo(string destDirName);
//destDirName:要将此目录移动到的目标位置的名称和路径。目标不能是另一个具有相同名称的磁盘卷或目录,它可以是要将此目录作为子目录添加到其中的一个现有目录。
DirectoryInfo info = new DirectoryInfo ("D:\\text "); //实例化
info.MoveTo(“D:\\test1”);
20.3.4 删除文件夹
- Directory类中的Delete方法
public static void Delete(string path);
//若文件夹下面是空的,删除此文件夹,否则不删除
public static void Delete(string path,bool recursive);
//path: 要移除的空目录/目录的名称
//recursive: 若要移除path中的目录、子目录和文件,则为true,否则为false
Directory. Delete("D:\\test");
Directory. Delete("D:\\test",true);
- DirectoryInfo类的Delete方法,永久删除
public override void Delete();
//若文件夹下面是空的,删除此文件夹,否则不删除
public void Delete(bool recursive);
//recursive: 若要移除path中的目录、子目录和所有文件,则为true,否则为false
DirectoryInfo info = new DirectoryInfo ("D:\\text "); //实例化
info.Delete();
20.3.5 遍历文件夹
GetDirectories方法,只遍历文件夹中的子文件夹
GetFiles方法,只遍历文件夹中的文件
GetFileSystemInfos方法,遍历文件夹中的所有子文件夹及文件
- DirectoryInfo类中的GetDirectories方法,返回当前目录的子目录
public DirectoryInfo[] GetDirectories();
public DirectoryInfo[] GetDirectories(string searchPattern);
public DirectoryInfo[] GetDirectories(string searchPattern, SearchOption searchOption);
//searchPattern: 搜索字符串,如用于搜索所有单词System开头的目录的”System*”
//searchOption: SearchOption枚举的一个值,指定搜索操作是应仅包含当前目录还是应包含所有子目录
- DirectoryInfo类中的GetFiles方法,返回当前目录的文件列表
public FileInfo[] GetFiles();
public FileInfo[] GetFiles(string searchPattern);
public FileInfo[] GetFiles(string searchPattern, SearchOption searchOption);
//searchPattern: 搜索字符串(如”*.txt”)
//searchOption: SearchOption枚举的一个值,指定搜索操作是应仅包含当前目录还是应包含所有子目录
- DirectoryInfo类中的GetFileSystemInfos方法,返回表示某个目录中所有文件和子目录的FileSystemInfo类型数组
public FileSystemInfo[] GetFileSystemInfos();
public FileSystemInfo[] GetFileSystemInfos(string searchPattern);
public FileSystemInfo[] GetFileSystemInfos(string searchPattern, SearchOption searchOption);
DirectoryInfo dinfo = new DirectoryInfo("D:\\text");
DirectoryInfo[] directoryInfo = dinfo.GetDirectories();
FileInfo[] fileInfo = dinfo.GetFiles();
FileSystemInfo[] fileSystemInfo = dinfo.GetFileSystemInfos();
foreach(var item in fileSystemInfo)
{
if(item is DirectoryInfo)
{
Console.WriteLine("{0} is Directory.",item.FullName);
}
else if(item is FileInfo)
{
Console.WriteLine("{0} is File.", item.FullName);
}
}