File,FileInfo类可以读取,写入,创建,删除,移动文件
· 在C# 4.0之前ReadAllLines()方法用于读取文件中所有的行,并以数组的形式返回,但是它有一个问题,就是它要等所有的行写入内存之后才能读取第一行内容。
· ReadLines()方法解决了这个问题,它返回IEnumerable
var path = Path.Combine(@"D:\迅雷下载", "ReadMe.txt");
//不推荐使用
var files = File.ReadAllLines(path);
foreach (var item in files)
{
Console.WriteLine(item);
}
//推荐使用
var files2 = File.ReadLines(path);
foreach (var item in files2)
{
Console.WriteLine(item);
}
· 如果要打开一个很大的文件,之前的方法要等整个文件都加入内存中,才能访问第一行。而这个新方法每次只读取一行,更加高效。
· Path类可以读取文件或目录的信息如:扩展名,文件,文件夹名,返回随机文件,创建临时文件等。
var fileName = @"D:\数据库文件\数据库.txt";
var ext = Path.GetExtension(fileName);
var dir = Path.GetDirectoryName(fileName);
var file = Path.GetFileName(fileName);
var fileWithoutExt = Path.GetFileNameWithoutExtension(fileName);
var rootName = Path.GetPathRoot(fileName);
var randomFile = Path.GetRandomFileName();
var fullName = Path.GetFullPath(randomFile);
var tempName = Path.GetTempFileName();
var tempPath = Path.GetTempPath();
var tempNameAfter = Path.ChangeExtension(tempName, "txt");
Console.WriteLine($"目录名称:{ dir },拓展名:{ext},文件名:{file},没有拓展名的文件名:{fileWithoutExt}");
Console.WriteLine($"根目录名称:{rootName},随机文件名:{randomFile},随机文件路径:{fullName},临时文件:{tempName}");
Console.WriteLine($"临时文件夹路径:{tempPath},修改后的临时文件:{tempNameAfter}");
· 流是一个用于传输数据的对象,数据可以向两个方向传输:
· 外部源 --> 程序 (读取流)
· 程序 --> 外部源 (写入流)
· 外部源可能是一些网络协议(接口),命名管道,内存区域
· 我们可以使用System.IO,MemoryStream对象读写内存
· System.Net.Sockets.NetworkStream对象处理网络数据
· Stream类对外部数据源不做任何假定,外部数据源可以是文件流,内存流,网络流或任意数据源。
· 一些流可以链接调用(chain),可以先使用DeflateStream压缩数据,然后写入到FileStream,MemoryStream或NetworkStream中。
· 直接读写流不是那么容易,但是可以使用阅读器和写入器,流入StringReader和StringWriter类。这是一个关注点分离。
使用FileStream类读写文本文件,需要使用字节数组。有更简单的方法:使用读取器(StreamReader)和写入器(StreamWriter),使用它们无需处理字节数组和编码,比较轻松。
使用FileStream读取文件的例子:
var path = Path.Combine(@"D:\迅雷下载", "ReadMe.txt");
using (FileStream stream = new FileStream(path,FileMode.OpenOrCreate))
{
byte[] b = new byte[stream.Length];
var r = stream.Read(b, 0, (int)stream.Length);
var s = Encoding.UTF8.GetString(b);
Console.WriteLine(s);
}
使用StreamReader读取文件的例子:
string path = @"D:\迅雷下载\ReadMe.txt";
goto s1;
s1:
//StreamReader可以使用EndOfStream检查是否在文件末尾,使用ReadLine()读取文本行
using (var stream = new StreamReader(path))
{
while(!stream.EndOfStream)
{
string line = stream.ReadLine();
Console.WriteLine(line);
}
}
s2:
//还可以使用File类的OpenText方法创建StreamReader,并且StreamReader还可以调用ReadToEnd()方法读取完整的文件。
using (var stream = File.OpenText(path))
{
var content = stream.ReadToEnd();
Console.WriteLine(content);
}