目录
前言
在日常开发中,文件操作是必不可少的,接下来如我们了解下c#的各种方法来读写文件和操作。
使用前导入命名空间using System.IO;
一、文件与文件夹
FileInfo、DirectoryInfo常用操作
//FileInfo DirectoryInfo
FileInfo fileInfo = new FileInfo(@"E:\programData\c#\ConsoleTest\文件操作\text.txt");
//复制
fileInfo.CopyTo(@"E:\programData\c#\ConsoleTest\文件操作\text1.txt");//赋值上面文件,命名为text1
//静态复制,需要复制的文件,复制后的文件
File.Copy(@"E:\programData\c#\ConsoleTest\文件操作\text.txt", @"E:\programData\c#\ConsoleTest\文件操作\text3.txt");
//文件夹 路径
DirectoryInfo directoryInfo = new DirectoryInfo(@"E:\programData\c#\ConsoleTest\文件操作\");
directoryInfo.Delete();//删除文件夹
DirectoryInfo parent = directoryInfo.Parent;//上级文件夹
if (!directoryInfo.Exists)//判断文件夹是否存在
directoryInfo.Create();//创建文件夹,不存在就可以
Console.WriteLine(directoryInfo.Root.FullName);//输出E:/ 获取根目录的名称
@符,默认转为字符串处理
二、读写文件
1.读取文件
string txt=File.ReadAllText("text.txt",System.Text.Encoding.ASCII);//读取全部内容,编码格式
Console.WriteLine(txt);
//一行一行读取的,返回一个字符串数组,每行代表一个字符串
string[] strArr=File.ReadAllLines("text.txt");
foreach(string s in strArr)
{
Console.WriteLine(s);
}
//返回一个字节数组,一般用来处理一些非文本文件的
byte[] bArr=File.ReadAllBytes("text.txt");
//不管是什么文件,他低层存储都是用0101这个二进制储存,一个字节对应8位01010110
2.写入文件
//路径,写入内容
File.WriteAllText("text.txt", "aizhaiyu.com");//该写入方式会覆盖掉原本内容
//按行写入,把字符串数组输入
File.WriteAllLines("text.txt", new string[] { "111", "222" });//该写入方式会覆盖掉原本内容
三、Path类
Path.Combine连接路径,不用关心在哪个系统上,因为win系统上的路径是\,而unix是/
//Path类
Console.WriteLine(Path.Combine(@"E:", "programData", "c#", "ConsoleTest", "文件操作", "text.txt"));
四、io流详解
当我们下载或合并文件的时候,必须使用到
1.读取写入FileStream
public void io(string path)
{
//获取开始时间
DateTime before =DateTime.Now;
//flieMode.Append文件追加
//创建流 路径,flieMode打开方式,FileAccess访问权限
FileStream readfs = new FileStream(path, FileMode.Open, FileAccess.Read);// 读取
//readfs.ReadByte();//一个一个字节读取,到末尾返回-1
//写入流,文件路径
FileStream writefs = new FileStream(path, FileMode.Create, FileAccess.Write);//写入
//writefs.WriteByte(); //一个一个字节写
//边读边写
int nextByte = -1;//读取到下一个字节
while((nextByte = readfs.ReadByte()) != -1)//有内容时
{
writefs.WriteByte((byte)nextByte);
}
//后开先关
writefs.Close();
//先开的后关
readfs.Close();
//获取结束时间
DateTime after = DateTime.Now;
//Subtracts时间删减
TimeSpan ts= after.Subtract(before);
Console.WriteLine(ts.TotalMilliseconds);//总秒数
}
明显当前水管一个一个字节读太慢了
优化
public void io(string path)
{
//获取开始时间
DateTime before =DateTime.Now;
//flieMode.Append追加
//创建流 路径,flieMode打开方式,FileAccess访问权限
FileStream readfs = new FileStream(path, FileMode.Open, FileAccess.Read);// 读取
//readfs.ReadByte();//一个一个字节读取,到末尾返回-1
//写入流,文件路径
FileStream writefs = new FileStream(path, FileMode.Create, FileAccess.Write);//写入
//writefs.WriteByte(); //一个一个字节写
//边读边写
//int nextByte = -1;//读取到下一个字节
//while((nextByte = readfs.ReadByte()) != -1)//有内容时
//{
// writefs.WriteByte((byte)nextByte);
//}
//优化
byte[] buffer = new byte[1024];//缓存
int count = -1;//每次读到了多少个字节
while ((count=readfs.Read(buffer,0,1024))!= 0)
{
writefs.Write(buffer, 0, count);
}
//ReadByte()只可以读取一个字节,Read可以读取很多个字节
//第一个把读取到的字节放到数组buffer里面,第二个是放到数组的哪个位置,第三是读取多少个字节
//int count=readfs.Read(buffer, 0, buffer.Length);//返回实际读取了多少个字节,Read之前没有读取到是返回-1,现在是返回读取到的字节,没有就0
//第一个 把buffer这个数组的数据进行写入,0是从索引为0开始取数据,count取多少个数据
//writefs.Write(buffer, 0, count);
//后开先关
writefs.Close();
//先开的后关
readfs.Close();
//获取结束时间
DateTime after = DateTime.Now;
//Subtracts时间删减
TimeSpan ts= after.Subtract(before);
Console.WriteLine(ts.TotalMilliseconds);//总秒数
}