Path类和File类
path类用来操作路径
string str = @"E:\Csharp Study Work\zero nine\laozhao.mav";
Console.WriteLine(Path.GetFileName(str));//获得文件名
Console.WriteLine(Path.GetFileNameWithoutExtension(str));//获得文件名,但是不包含扩展名
Console.WriteLine(Path.GetExtension(str));//获得文件的扩展名
Console.WriteLine(Path.GetDirectoryName(str));//获得文件所在文件夹的名称
Console.WriteLine(Path.GetFullPath(str));//获得文件的全路径
Console.WriteLine(Path.Combine(@"c:\a\", "b.txt"));//连接两个字符串作为路径
File类用来操作文本文件
//创建一个文件
File.Create(@"E:\Csharp Study Work\zero nine\new.txt");
Console.WriteLine("创建成功");
Console.ReadKey();
//删除一个文件
File.Delete(@"E:\Csharp Study Work\zero nine\new.txt");
Console.WriteLine("删除成功");
//复制一个文件
File.Copy(@"E:\Csharp Study Work\zero nine\new.txt", @"E:\Csharp Study Work\zero nine\code.txt");
Console.WriteLine("复制成功");
Console.ReadKey();
文件大小
1024byte=1kb
1024kb=1M
1024M=1G
1024G=1T
1024T=1PT
绝对路径和相对路径
绝对路径是指通过给定的路径,直接能在电脑中找到这个文件
相对路径是指文件相对于应用程序(.exe)的路径,也就是把这个要读取的文件放到可执行文件的同一文件夹下。
我们在开发中应该尽量的去使用相对路径。
装箱和拆箱
装箱:将值类型转换为引用类型
int n = 10;
object o = n;
拆箱:将引用类型转换为值类型
int nn = (int)o;
看这两种类型是否发生了装箱或者拆箱,要看这两种类型是否存在继承关系。
如果存在继承关系,则有可能发生装箱或拆箱,如果不存在继承关系,则一定不存在装箱或拆箱。
编码
Encoding.编码格式.方法();
编码简介
编码就是将字符串以怎样的形式存为二进制
产生乱码的原因,就是你保存这个文件所采用的编码,跟你打开这个文件所采用的编码格式不一样。
File读写
读数据
第一步,使用File.ReadAllBytes——返回一个字节数组
第二步,使用Encoding.Default.GetString(字节数组)——将字节数组中的每一个元素都按照我们指定的编码格式解码成字符串
byte[] buffer = File.ReadAllBytes(@"E:\Csharp Study Work\one zero\10.txt");
string s = Encoding.UTF8.GetString(buffer);
Console.WriteLine(s);
Console.ReadKey();
写数据
第一步,使用Encoding.Default.GetBytes(字符串)——将字符串转换为一个字节数组
第二步,使用File.WriteAllBytes——将字节数组写入
string str = "今天天气好晴朗处处好风光";
byte[] buffer = Encoding.Default.GetBytes(str);
File.WriteAllBytes(@"E:\Csharp Study Work\one zero\new.txt",buffer);
Console.WriteLine("写入");
Console.ReadKey();
以行的形式读取
使用File.ReadAllLines(地址,解码)——返回一个字符串数组
string[] contents = File.ReadAllLines(@"E:\Csharp Study Work\one zero\抽象类特点.txt", Encoding.Default);
foreach (string item in contents)
{
Console.WriteLine(item);
}
Console.ReadKey();
以整体的形式读取
使用File.ReadAllText(地址,解码)——返回一个字符串
string str = File.ReadAllText(@"E:\Csharp Study Work\one zero\10.txt",Encoding.Default);
Console.WriteLine(str);
Console.ReadKey();
以行的形式写入(会覆盖原文本的内容)
使用File.WriteAllLines(地址,字符串数组)
File.WriteAllLines(@"E:\Csharp Study Work\one zero\new.txt", new string[] { "aoe","ewu" });
Console.WriteLine("chenggong");
Console.ReadKey();
以整体的形式写入(会覆盖原文本的内容)
使用File.WriteAllText(地址,字符串)
File.WriteAllText(@"E:\Csharp Study Work\one zero\new.txt", "zslswwzl");
Console.WriteLine("成功");
Console.ReadKey();
不会覆盖写入
使用File.AppendAllText(地址,字符串)
File.AppendAllText(@"E:\Csharp Study Work\one zero\new.txt", "看我有没有覆盖");
Console.WriteLine("成功");
Console.ReadKey();
文件流
当我们操作的文件过大的时候,如果使用File类操作,会给内存带了很大的负荷,因此采用文件流来操作文件。
对于File类的好处是,文件流可以操作大文件,内存负荷小。
*FileStream(必须掌握的)
FileStream是用来操作字节的文件流。
读取数据步骤:
1.首先创建FileStream对象
FileStream fsRead = new FileStream(@"E:\Csharp Study Work\one zero\new.txt", FileMode.OpenOrCreate, FileAccess.Read);
设定一个一次读取的字节大小
byte[] buffer = new byte[1024 * 1024 * 5];
int r = fsRead.Read(buffer, 0, buffer.Length);//返回本次实际读取到的有效字节数
2.将字节数组中的每一个元素按指定的编码格式解码成字符串
string s = Encoding.UTF8.GetString(buffer, 0, r);
3.关闭流,释放流所占资源
fsRead.Close();
fsRead.Dispose();
Console.WriteLine(s);
Console.ReadKey();
或者将创建文件流对象的过程放进using中,可以自动的帮助我们释放资源
using()
{
创建文件流对象过程
}
写入数据过程:
using (FileStream fsWrite = new FileStream(@"E:\Csharp Study Work\one zero\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
string str = "看我覆盖没有";
byte[] buffer = Encoding.UTF8.GetBytes(str);
fsWrite.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("成功");
Console.ReadKey();
使用FileStream实现一个多媒体文件的复制
思路:先将要复制的文件读取出来,然后写入指定的位置
Main函数:
string source = @"要读取的文件地址";
string targer = @"要写入的文件地址";
CopyFile(source,targer);
Console.WriteLine("成功");
Console.ReadKey();
public static void CopyFile(string source,string targer)
{
using(FileStream fsRead = new FileStream(source,FileMode.Open,FileAccess.Read))
{
using(FileStream fsWrite = new FileStream(targer,FileMode.OpenOrCreate,FileAccess.Write))
{
byte[] buffer = new byte[1024*1024*5];
while(true)
{
int r = fsRead.Read(buffer,0,buffer.Length);
if(r==0)
{
break;
}
fsWrite.Write(buffer,0,r);
}
}
}
}
StreamReader和StreamWriter
这两个是操作字符的,
使用StreamReader来读取一个文件:
using(StreamReader sr=new StreamReader(@"C:\Users\Flame Master\Desktop\1.txt",Encoding.Default))
{
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
}
Console.ReadKey();
使用StreamWriter来写入一个文本文件(不想覆盖的话需要在后边加变量,true)
using (StreamWriter sw = new StreamWriter(@"C:\Users\Flame Master\Desktop\new.txt"))
{
sw.Write("今天天气好晴朗,处处好风光");
}
Console.WriteLine("成功");
Console.ReadKey();
序列化和反序列化
作用:传输数据
使用[Serializable]标记一个类
序列化:就是将对象转化为二进制
BinaryFormatter 序列化对象 = new BinaryFormatter();
序列化对象.Serialize(地址,对象);
[Serializable]
public class Person
{
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
private int _age;
public int Age
{
get { return _age; }
set { _age = value; }
}
}
//要将这个p对象传输给对方电脑
Person p = new Person();
p.Name = "zs";
p.Age = 18;
p.Gender = '男';
//1.将这个类标记为可以被序列化
using (FileStream fsWrite = new FileStream(@"C:\Users\Flame Master\Desktop\111.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
//开始序列化对象
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fsWrite, p);
}
Console.WriteLine("序列化成功");
反序列化:将二进制转化为对象
BinaryFormatter 反序列化对象 = new BinaryFormatter();
对象 = (类名)反序列化对象.Deserialize();
//接收对方发送过来的二进制,反序列化成对象
Person p = new Person();
using(FileStream fsRead=new FileStream(@"C:\Users\Flame Master\Desktop\111.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
BinaryFormatter bf = new BinaryFormatter();
p = (Person)bf.Deserialize(fsRead);
}
Console.WriteLine(p.Name);
Console.WriteLine(p.Age);
Console.WriteLine(p.Gender);
Console.ReadKey();