- 文件可以看作是数据的集合,一般保存在磁盘或其他存储介质上
- 文件I/O(数据的输入/输出)通过流(Stream)来实现;流提供一种向存储写入字节和从存储读取字节的方式
- 对于流有5 种基本的操作:打开、读取、写入、改变当前位置、关闭
- .NET Framework的System.IO命名空间如下图所示
DriveInfo类:
提供方法和属性以查询驱动器信息。使用DriveInfo类可以确定可用的驱动器及其类型;确定驱动器的容量和可用空闲空间等.
//Driveinfo类
DriveInfo[] drivers = DriveInfo.GetDrives();
foreach (var d in drivers)
{
Console.WriteLine($"Total size:{Math.Round(d.TotalSize/Math.Pow(1024,3),2)}GB,FreeSpace:{Math.Round(d.AvailableFreeSpace/ Math.Pow(1024, 3), 2)}GB,Format:{d.DriveFormat},Name:{d.Name},root path:{ d.RootDirectory.Name},Drivetype:{d.DriveType.ToString()}");
}
Console.ReadKey();
//Directory类
if (!Directory.Exists("D:\\MyRoot"))
Directory.CreateDirectory("D:\\MyRoot");
if (Directory.Exists("D:\\MyRoot"))
Directory.Delete("D:\\MyRoot",true);//删除子目录
Directory和DirectoryInfo类:
- 提供用于目录基本操作的方法,包括创建、复制、移动、重命名和删除目录;获取和设置目录的创建、访问及写入的时间戳信息等;
- Directory所有方法都是静态的,调用时需要传入目录路径参数。DirectoryInfo类提供实例方法,需要针对要操作的目录路径创建DirectoryInfo类的实例,然后调用相应的实例方法,适用于对目录路径执行多次操作
- Directory类的静态方法可以直接调用,而无需构建对象实例,故适用于对目录路径执行一次操作;然而Directory类的静态方法对所有方法都执行安全检查,如果需要多次重用某个对象,建议使用DirectoryInfo的相应实例方法
//GetDirectories/GetFiles
string path = "D:\\dwang";
string[] files = Directory.GetFiles(path);
string[] dirs = Directory.GetDirectories(path);
string curr = Directory.GetCurrentDirectory();//当前项目exe目录
string c = Directory.GetDirectoryRoot(path);//获取指定Path的根目录
File和FileInfo类
- File所有方法都是静态的
- 可以使用File类的静态方法Create/Open或FileInfo类的实例方法Create/Open创建或打开文件。创建文件后返回流对象FileStream/StreamWriter.
- FileMode:CreateNew, Open, OpenOrCreate, Append, Truncate(打开现有文件,并清空内容).
StreamReader和StreamWriter类
- 分别以一种特定的编码从字节流中读取字符和向流中写入字符
- 分别实现字符串的读取和写入操作
- 读写步骤:1.创建StreamWriter/StreamReader对象,2.写入/读取数据,3.关闭流.
- 写入文件完成后,应该使用Close方法关闭流。否则,可能导致缓冲的数据没有最终更新到文件中, 文件操作一般采用using语句,可取代close方法.
//StreamWriter类
string path_stream = @"D:\dwang\test.txt";
using (StreamWriter sw = new StreamWriter(path_stream, true))
{
sw.WriteLine("this is the content I wrote by streamwriter.");
}
//StreamReader类,while判断读取的内容必须同时赋值给字符串,否则循环内部无法读取的行内容到屏幕
using (StreamReader sr = new StreamReader(path_stream))
{
string line = string.Empty;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
Console.ReadKey();
FileStream类读写文件:
- FileStream类支持通过其Seek方法随机访问文件
- Seek通过字节偏移量将读取/写入位置移动到文件中的任意位置,字节偏移量是相对于查找参考点(文件的开始、当前位置或结尾,分别对应于SeekOrigin.Begin、SeekOrigin.Current和SeekOrigin.End)
- 读写操作步骤:
- 定位filestream对象;
- 定位;打开文件后(即创建FileStream对象实例后),可以使用其实例方法Seek将该流的当前位置设置为给定值, 例如:fs.Seek(0,SeekOrigin.Begin); //定位到开始位置
- 打开文件后(即创建FileStream对象实例后),可以使用其实例方法Write/Read,写入或读取字节数据
- 使用Close方法关闭流,或创建对象时用using关键字,执行完自动关闭流.
//FileStream write & read
using (FileStream fs = File.Open(@"D:\dwang\test.data", FileMode.Open,FileAccess.ReadWrite))
{
string stringToWrite = "this is written by Filestream";
fs.Write(Encoding.Default.GetBytes(stringToWrite),0,stringToWrite.Length);
//read test.data all content
fs.Seek(0, SeekOrigin.Begin);
byte[] b = new byte[1024];
while(fs.Read(b,0,b.Length)>0)
{
Console.WriteLine(Encoding.Default.GetString(b));
}
Console.ReadKey();
}