【C#学习记录】六、文件读写相关操作
2022/2/28 20:22:25
本文主要是介绍【C#学习记录】六、文件读写相关操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
目录- Path类
- 常用方法
- File类
- 文件操作函数
- 简单的文件读写
- 相对路径和绝对路径
- FileStream类
- 使用FileStream读文件
- 将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源
- 多媒体文件的赋值
- StreamWriter/StreamReader类
Path类
在System.IO命名空间中,是一个静态类
常用方法
-
Path.GetFileName();
获得文件名
-
Path.GetFileNameWithoutExtension();
获得文件名但不包含扩展名
-
Path.GetExtension();
获得文件的扩展名
-
Path.GetDirectoryName();
获得文件所在的文件夹的名称
-
Path.GetFullPath();
获得文件的全路径
-
Path.Combined();
连接两个字符串作为路径
File类
File类只能读取小文件,因为只能一次性读写,大文件需要用FileStream类。
文件操作函数
-
File.Create();
创建一个文件,如果有这个文件,则不会创建新的文件,但文件修改时间被修改。
-
File.Delete();
删除一个文件
-
File.Copy();
复制一个文件
简单的文件读写
编码:将字符串以怎样的形式保存为二进制
乱码:产生乱码的原因:就是你保存这个文件所采用的编码,跟你打开这个文件所采用的编码格式不一样。
编码特点 | 特点 |
---|---|
Asc | 128 |
ASCII | 256 |
GB2312 | 包含简体字 |
Big5 | 包含繁体字 |
unicode | 比较全,解析起来慢 |
UTF-8 | 针对web的编码 |
-
File.ReadAllBytes()
字符数组-->字符串,Encoding.Default.GetString(字节数组)
-
File.WriteAllByte()
字符串-->字符数组,Encoding.Default.GetByte(字符串),没有这个文件的话,会给你创建一个,有的话会覆盖掉。
读文件方法 | 说明 |
---|---|
File.ReadAllByte() | 可以读任何文件,按照字节读取,但是需要Encoding.Default.GetString()转换成字符串,或转换成其他格式 |
File.ReadAllLine() | 只能读取TXT文件,按照行读取,输出string[] |
File.ReadAllText() | 只能读取TXT文件,读取全部文件,输出string[] |
File.WriteAllLines() | 按照行写TXT文件,File.WriteAllLines(path, new string[]{"str1","str2"}); |
File.WriteAllText() | 写所有TXT文件,File.WriteAllText(path, str); |
File.AppendAllText() | File.AppendAllText(path,str),不会覆盖掉原文件 |
相对路径和绝对路径
绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件。
相对路径:文件相对于应用程序的路径。
我们在开发中应该去尽量的使用相对路径。
FileStream类
类别 | 特点 |
---|---|
File | 一次性读写 |
FileStream | 按流读写,操作字节的 |
StreamReader/StreamWriter | 按流读写,操作字符的 |
使用FileStream读文件
using System.IO; using System.Text; string path = @"C:\Users\徐志强\Desktop"; FileStream fsRead = new FileStream(path + @"\testFile.txt", FileMode.OpenOrCreate, FileAccess.Read); byte[] buffer = new byte[1024 * 1024 * 5]; //r存储的是这次读出来的实际有效字节数 int r = fsRead.Read(buffer,0,buffer.Length); //将字节数组中每一个元素按照指定的编码格式解码成字符串 string s = Encoding.Default.GetString(buffer,0,r); //关闭流 fsRead.Close(); //释放流所占用的资源 fsRead.Dispose(); Console.WriteLine(s); Console.ReadKey();
将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源
using System.IO; using System.Text; string path = @"C:\Users\徐志强\Desktop"; using (FileStream fsWrite = new FileStream(path+@"\testFile.txt",FileMode.OpenOrCreate,FileAccess.Write)) { string str = "看这段文字有没有覆盖掉原文"; byte[] buffer2 = Encoding.Default.GetBytes(str); fsWrite.Write(buffer2); } Console.Clear(); using (FileStream fsRead = new FileStream(path+@"\testFile.txt",FileMode.OpenOrCreate,FileAccess.Read)) { byte[] buffer3 = new byte[1024*1024*5]; int r = fsRead.Read(buffer3,0,buffer3.Length); string s = Encoding.Default.GetString(buffer3,0,r); Console.WriteLine(s); } Console.ReadKey();
多媒体文件的赋值
错误的做法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace FileStream类 { internal class CopyFile { public static void CopyFileFcn(string source, string target) { using (FileStream fsRead = new FileStream(source,FileMode.OpenOrCreate,FileAccess.Read)) { byte[] bufferRead = new byte[1024 * 1024 * 5]; int r = fsRead.Read(bufferRead, 0, bufferRead.Length); while (r != 0) { using (FileStream fsWrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write)) { fsWrite.Write(bufferRead, 0, r); } r = fsRead.Read(bufferRead, 0, bufferRead.Length); } } } } }
正确的做法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO; namespace FileStream类 { internal class CopyFile { public static void CopyFileFcn(string source, string target) { using (FileStream fsRead = new FileStream(source, FileMode.OpenOrCreate, FileAccess.Read)) { byte[] bufferRead = new byte[1024 * 1024 * 5]; using (FileStream fsWrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write)) { int r = fsRead.Read(bufferRead, 0, bufferRead.Length); while (r != 0) { fsWrite.Write(bufferRead, 0, r); r = fsRead.Read(bufferRead, 0, bufferRead.Length); } } } } } }
请注意这里的while用法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
当一个文件比较大需要循环读取的时候,不能循环创建文件流。
文件流循环读取过程中,会自动记录当前读取的byte位置,读取的offset设置成0即可。
当读取返回0,也就意味着什么都没有读到,读取完了。
StreamWriter/StreamReader类
using System.IO; string strSourceTxt = @"C:\Users\徐志强\Desktop\testFile.txt"; using (StreamWriter sw = new StreamWriter(strSourceTxt,true,Encoding.Default)) { sw.Write("啦啦啦啦啦啦啦啦啦啦啦"); } using (StreamReader sr = new StreamReader(strSourceTxt, Encoding.Default)) { while (!sr.EndOfStream) { Console.WriteLine(sr.ReadLine()); } }
这篇关于【C#学习记录】六、文件读写相关操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-12-06使用Microsoft.Extensions.AI在.NET中生成嵌入向量
- 2024-11-18微软研究:RAG系统的四个层次提升理解与回答能力
- 2024-11-15C#中怎么从PEM格式的证书中提取公钥?-icode9专业技术文章分享
- 2024-11-14云架构设计——如何用diagrams.net绘制专业的AWS架构图?
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#