文件和流IO

  • 文件可以看作是数据的集合,一般保存在磁盘或其他存储介质上
  • 文件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.
  •  FileModeCreateNew, 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)
  • 读写操作步骤:
  1. 定位filestream对象;
  2. 定位;打开文件后(即创建FileStream对象实例后),可以使用其实例方法Seek将该流的当前位置设置为给定值, 例如:fs.Seek(0,SeekOrigin.Begin); //定位到开始位置
  3. 打开文件后(即创建FileStream对象实例后),可以使用其实例方法Write/Read,写入或读取字节数据
  4. 使用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();
}
  • 29
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值