C# 文件IO常用类

File,FileInfo类可以读取,写入,创建,删除,移动文件

· 在C# 4.0之前ReadAllLines()方法用于读取文件中所有的行,并以数组的形式返回,但是它有一个问题,就是它要等所有的行写入内存之后才能读取第一行内容。

· ReadLines()方法解决了这个问题,它返回IEnumerable而不是string数组,这个新增的方法要高效很多,它不是将所有行一次性加载进内存中,而是每次读取一行。

            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);
            }

 

你可能感兴趣的:(BCL,IO,文件)