在System.IO命名空间中,是一个静态类
Path.GetFileName();
获得文件名
Path.GetFileNameWithoutExtension();
获得文件名但不包含扩展名
Path.GetExtension();
获得文件的扩展名
Path.GetDirectoryName();
获得文件所在的文件夹的名称
Path.GetFullPath();
获得文件的全路径
Path.Combined();
连接两个字符串作为路径
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),不会覆盖掉原文件 |
绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件。
相对路径:文件相对于应用程序的路径。
我们在开发中应该去尽量的使用相对路径。
类别 | 特点 |
---|---|
File | 一次性读写 |
FileStream | 按流读写,操作字节的 |
StreamReader/StreamWriter | 按流读写,操作字符的 |
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 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,也就意味着什么都没有读到,读取完了。
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()); } }