文件操作 File Operation
程序中所有数据都以流的形式进行传输,流分字节流和字符流。读取文件就是输入流,保存到文件就是输出流,操作Unicode编码的数据就是处理以两个字节为单位的字符流,操作以一个字节为单位的数据就是处理字节流,前者输入到string变量以便操作,后者则输入到byte数组变量以便操作(byte数组的每个元素就是8个位,也即每个单位都是一个字节)。一个文档保存的字符数据其实都是以byte进行存储,系统会将字符的编码(二进制的ASCII编码或十进制的Unicode编码)存储到磁盘文件里。打开文件后,可以读取字符或字节(一个字节一个字节地读取)。编码类UnicodeEncoding提供两个方法用于将字节序列转换为字符或将字符转换为字节序列。
UnicodeEncoding类
//获取字符的字节序列,返回一个byte[]数组
//示例:
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());
GetString(byte[] strByte)
//示例:
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());
encoding.GetString(strByte);
Stream类
提供对字节流的读写操作,它是以字节的形式操作数据。
FileStream类
提供对文件字节流的读写操作,它从Stream派生,同样是以字节的形式操作数据。无构造函数,只能靠File或FileInfo类的打开文件的方法(Open()等方法)创建。
MemoryStream类
此类用于向内存读写数据而非向文件读写数据。提供对内存中的字节流的读写操作,它从Stream派生,同样是以字节的形式操作数据
MemoryStream memory = new MemoryStream(new byte[20]);
UnicodeEncoding unicode = new UnicodeEncoding();
byte[] strByteArray = unicode.GetBytes("hello word");//将字符串编码为字节序列,存入字节数组
memory.Write(strByteArray, 0, strByteArray.Length);//将整个字节序列写入内存
//读取内存流
memory.Seek(0, SeekOrigin.Begin);
byte[] byteArray = new byte[memory.Length];
int count = memory.Read(byteArray, 0, strByteArray.Length);//将读取的数据存入字节数组,返回字节总数
char[] charArray = new char[unicode.GetCharCount(byteArray, 0, count)];//解码字节数组,将结果字符存入char数组
unicode.GetDecoder().GetChars(byteArray, 0, count, charArray, 0);
string result = new string(charArray);
Console.WriteLine(result);
Path类
//获取默认的关于文件夹路径可能的非法字符列表,返回一个char[]存储这些内置的非法字符
Path.GetInvalidFileNameChars();
//获取默认的关于文件路径可能的非法字符列表,返回一个char[]存储这些内置的非法字符
File
与FileInfo的区别在于,此类提供操作文件的静态方法,而FileInfo需要创建实例,如果频繁操作文件,应考虑使用FileInfo。File类没有任何属性,它只提供一个FileAttributes枚举来表示文件的属性,而FileInfo类则提供了N多个属性来表示文件的属性。
//打开一个文件,返回一个FileStream对象。如果文件不存在则通过FileMode指定应创建该文件
//-------FileMode枚举可能的值如下:-------
//CreateNew:创建新文件,如果文件已经存在,则引发IOException;
//Create:创建新文件,如果文件已经存在,原文件将被覆盖;
//Open:打开现有文件,如果文件不存在,则引发FileNotFoundException;
//OpenOrCreate:打开文件,如果文件不存在,则创建新文件;
//Truncate:打开现有文件,文件一旦打开,就将截断为零字节大小;
//Append:打开先有文件并把指针移动至文件尾,如果文件不存在将创建新文件。此枚举值必须同FileAccess.Write一起使用
//-------FileAccess枚举可能的值如下:-------
//Read:只读;
//Write:只写;
//ReadWrite:读写;
//示例:
FileStream stream = File.Open(@"d:/test.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] strByte = encoding.GetBytes("hello word!".ToCharArray());
stream.Write(strByte, 0, strByte.Count());
//以下两个方法都是以只读的方式打开文件,都返回一个FileStream对象
OpenRead、OpenWrite
//以下三个方法都是打开文件并全部读取后关闭
ReadAllBytes、ReadAllLines、ReadAllText
//以下三个方法都是创建一个文件并全部写入后关闭
WriteAllBytes、WriteAllLines、WriteAllText
ReadLines(String str | String str, Encoding encoding)
//读取文件的行
//示例:
foreach (string line in File.ReadLines(@"d:\test.txt"))
{
if (line.Contains("episode") & line.Contains("2006"))
{
Console.WriteLine(line);
}
}
//此类还提供了操作文件的其它方法:
//AppendAllLines(追加)、Copy(拷贝)、Move(移动)、
//Create(创建)、Delete(删除)、Encrypt(加密)、Decrypt(解密)
//Exists(是否存在)、Replace(用另一个文件的内容替换当前文件的内容)、
//Get / SetAttributes(设置或获取属性)、Get / SetCreationTime(设置或获取创建时间)、Get / SetLastAccessTime(获取或设置最近一次访问的时间)
FileInfo类
除了具有File的方法以外,它提供一系列的属性来表示文件的属性。
//获取或设置当前文件或目录的特性
CreationTime
//获取或设置当前文件或目录的创建时间
CreationTimeUtc
//获取或设置当前文件或目录的创建时间,其格式为协调世界时(UTC)
Directory
//获取父目录的实例。
DirectoryName
//获取表示目录的完整路径的字符串
Exists
//获取指示文件是否存在的值。(覆盖 FileSystemInfo.Exists)
Extension
//获取表示文件扩展名部分的字符串
FullName
//获取目录或文件的完整目录
IsReadOnly
//获取或设置确定当前文件是否为只读的值
LastAccessTime
//获取或设置上次访问当前文件或目录的时间
LastAccessTimeUtc
//获取或设置上次访问当前文件或目录的时间,其格式为协调世界时(UTC)
LastWriteTime
//获取或设置上次写入当前文件或目录的时间
LastWriteTimeUtc
//获取或设置上次写入当前文件或目录的时间,其格式为协调世界时(UTC)
Length
//获取当前文件的大小(以字节为单位)
Name
//获取文件名
Directory类
//创建目录,如果字符路径包含子目录名称,将一并创建
//示例:
string path = @"e:/Animal/Person/Employee/";
DirectoryInfo dir = Directory.CreateDirectory(path);
EnumerateDirectories(string path)
//返回一个IEnumerable<string>集合,存储了每个目录的名称的字符表示,类似的有DirectoryInfo的EnumerateDirectories方法,返回一个IEnumerable<DirectoryInfo>集合,存储每个目录的实例
//也可以使用GetDirectories,该方法返回string[],类似的有DirectoryInfo的GetDirectories,返回DirectoryInfo[]
EnumerateFiles(string path,[string search])
//返回一个IEnumerable<string>集合,存储了当前目录下的文件的名称的字符表示,类似的有DirectoryInfo的EnumerateFiles方法,返回一个IEnumerable<FileInfo>集合,存储每个文件的实例
//也可以使用GetFiles,该方法返回string[],类似的有DirectoryInfo的GetFiles,返回FileInfo[]
//示例:
string path = @"e/";
var txtFiles = Directory.EnumerateFiles(path, "*.txt");
var fileNameStr = txtFiles.Where(fileName => fileName.Contains("a"));
GetCurrentDirectory()
//获取当前应用程序的工作目录
GetDirectories(string path)
//返回一个string[],存储了当前目录的子目录集合,类似的有DirectoryInfo的GetDirectories方法,返回一个DirectoryInfo[],存储了当前目录的每个子目录的实例
GetDirectoryRoot(string path)
//返回目录的卷信息和根信息
GetParent(string path)
//获取当前目录的父目录,返回一个DirectoryInfo实例表示父目录,类似的有DirectoryInfo的Parent属性
SetCurrentDirectory(string path)
//将当前应用程序的工作目录设置为参数指定的目录
//此类还提供了操作文件的其它方法:
//Delete(删除)、Exists(是否存在)、Move(移动)[等同于DirectoryInfo的MoveTo方法]
//Get/SetCreationTime(设置或获取创建时间)、Get/SetLastAccessTime(最近一次访问目录的时间)、Get/SetLastWriteTime(最近一次写入数据到目录的时间)
DirectoryInfo类
除了具有Directory类的方法以外,它提供一系列的属性来表示目录的属性。
//获取或设置当前文件或目录的特性。
CreationTime
//获取或设置当前文件或目录的创建时间。
CreationTimeUtc
//获取或设置当前文件或目录的创建时间,其格式为协调世界时(UTC)。
Exists
//获取指示目录是否存在的值。(覆盖 FileSystemInfo.Exists。)
Extension
//获取表示文件扩展名部分的字符串。
FullName
//获取目录的完整路径。(覆盖 FileSystemInfo.FullName。)
LastAccessTime
//获取或设置上次访问当前文件或目录的时间。
LastAccessTimeUtc
//获取或设置上次访问当前文件或目录的时间,其格式为协调世界时(UTC)。
LastWriteTime
//获取或设置上次写入当前文件或目录的时间。
LastWriteTimeUtc
//获取或设置上次写入当前文件或目录的时间,其格式为协调世界时(UTC)。
Name
//获取此 DirectoryInfo 实例的名称。(覆盖 FileSystemInfo.Name。)
Parent
//获取指定的子目录的父目录。
Root
//获取目录的根部分。