Path
练习
//程序主要的任务是进行数据的处理,那么处理好的数据被存储在内存当中,内存中的数据会随着程序运行的结果
//而消失,如果需要将处理好的数据进行永久的保存,那么就需要使用io流技术将处理好的数据存储到文件夹中,
//但是文件又是按照路径的方式存储在磁盘上,因此我们应该先学习路径的操作
//Path:该类就是c#程序员提供的一个用于操作路径地静态类
string path = "D:/vs存储/io技术/io技术/Program.cs";
//原理
int index = path.LastIndexOf("/");
string filename=path.Substring(index + 1);
Console.WriteLine(filename);
//使用Path类获取路径中文件名的获取
//获取路径中的文件名
Console.WriteLine(Path.GetFileName(path));
//获取路径中的文件名:不带扩展
Console.WriteLine(Path.GetFileNameWithoutExtension(path));
//获取扩展名
Console.WriteLine(Path.GetExtension(path));
//获取路径的分隔符
Console.WriteLine(Path.DirectorySeparatorChar);
//获取目录名
Console.WriteLine(Path.GetDirectoryName(path));
//获取相对路径:./当前路径,../上一层路径
Console.WriteLine(Path.GetFullPath("./"));
Console.WriteLine(Path.GetFullPath("../"));
Console.ReadKey();
File
练习
#region //File
//该类用于描述系统中具体的文件,是一个静态类,提供了很多操作文件的方法
//方法:Exists()判断指定的文件是否存在,Create()创建文件,
//Delete()删除文件
//Copy()文件拷贝
//Move()文件剪切
//当操作文件的拷贝和剪切的时候一定要是使用Dispose()方法先释放系统的文件资源
if (File.Exists("./Text.txt"))
{
Console.WriteLine("文件存在哦");
//删除文件
File.Delete("./Text.txt");
Console.WriteLine("文件删除成功");
//创建文件
File.Create("./Text.txt").Dispose();
Console.WriteLine("文件创键成功哦");
}
else
{
Console.WriteLine("文件不存在哦");
//创建文件
File.Create("./Text.txt").Dispose();
Console.WriteLine("文件创键成功哦");
}
//进行文件拷贝
File.Copy("./Text.txt", "D:/.idea/Text.txt");
Console.ReadKey();
#endregion
FileInfo
练习
#region //FileInfo
//定义:FileInfo是一个c#提供的用于操作系统文件的类,该类是一个非静态类,使用的时候需要创建
//对象进行使用,类似于File静态类
//区分:什么时候用File,什么时候用FileInfo
//如果是对一个文件进行多次操作建议使用FileInfo
//如果是对多个文件进行单一操作建议使用File
//File静态类每次调用静态方法操作文件的时候,都需要占用cpu的时间进行文件的安全检查处理,比较耗时
//FileInfo是每次创建类对象的时候才进行安全检查,因此适合对一个文件进行多次操作
FileInfo fileInfo = new FileInfo("./Text.txt");
if (fileInfo.Exists)
{
//存在
fileInfo.Delete();
Console.WriteLine("文件删除成功");
//创建
fileInfo.Create().Dispose();
Console.WriteLine("文件创建成功");
}
else
{
//不存在
fileInfo.Create().Dispose();
Console.WriteLine("文件创建成功");
}
//拷贝
// fileInfo.CopyTo("D:/vs存储/Text.txt");
//移动
fileInfo.MoveTo("D:/vs存储/Text.txt");
Console.ReadKey();
#endregion
Directory
练习
#region //Directory
//定义:该类是c#提供的用于操作文件系统中文件夹或目录的静态类,提供了操作文件夹的相关静态函数
//Exists():判断文件夹是否存在
//Delete()删除指定文件夹
//CreateDirectory()创建指定文件夹
//Move()剪切文件夹
//GetDirectories():获取文件夹下的子文件夹
//GetFiles()获取文件夹下的文件
//GetFileSystemEntries()获取文件夹下的所有子文件夹和文件
if (Directory.Exists("./Text"))
{
//有文件夹?
//删除文件夹
Directory.Delete("./Text");
Console.WriteLine("文件夹删除成功");
//创建文件夹
Directory.CreateDirectory("./Text");
Console.WriteLine("文件夹创建成功");
}
else
{
//没有文件夹?
//创建文件夹
Directory.CreateDirectory("./Text");
Console.WriteLine("文件夹创建成功");
}
//文件夹剪切
//Directory.Move("./Text", "D:/t/photo/Text");
//Console.WriteLine("文件夹剪切成功");
//获取指定文件夹下面的子文件夹或文件
Console.WriteLine(Path.GetFullPath("../../"));
string[] dircs = Directory.GetDirectories("../../");
foreach(var item in dircs)
{
Console.WriteLine(item);
}
Console.WriteLine("--------");
//获取指定文件夹下的文件
string[] files = Directory.GetFiles("../../");
foreach(var item in files)
{
Console.WriteLine(item);
}
Console.WriteLine("-----");
//获取指定文件夹下的子文件和文件
string[] entries = Directory.GetFileSystemEntries("../../");
foreach(var item in entries)
{
Console.WriteLine(item);
}
Console.ReadKey();
#endregion
DirectoryInfo
练习
#region //DirectoryInfo
//c#提供用于操作文件夹的实例类,使用的时候需要创建该类的对象,功能类似于Directory静态类
DirectoryInfo directoryInfo = new DirectoryInfo("./Text");
if (directoryInfo.Exists)
{
//有这个文件夹
directoryInfo.Delete();
Console.WriteLine("文件删除成功");
directoryInfo.Create();
Console.WriteLine("文件夹创建成功");
}
else
{
//没有这个文件夹
directoryInfo.Create();
Console.WriteLine("文件夹创建成功");
}
移动文件夹
//directoryInfo.MoveTo("D:/t/photo/Text");
//Console.WriteLine("文件夹移动over");
//获取指定文件夹下面的子文件夹
directoryInfo = new DirectoryInfo("../../");
DirectoryInfo[] directoryInfos = directoryInfo.GetDirectories();
foreach(var item in directoryInfos)
{
Console.WriteLine(item.Name);
Console.WriteLine(item.FullName);
}
Console.WriteLine("------------");
//获取指定文件夹下面的文件
FileInfo[] fileInfos = directoryInfo.GetFiles();
foreach(var item in fileInfos)
{
Console.WriteLine(item.Name);
}
Console.WriteLine("-------------");
//获取指定文件夹下面的子文件夹和文件
FileSystemInfo[] fileSystemInfos = directoryInfo.GetFileSystemInfos();
foreach(var item in fileSystemInfos)
{
Console.WriteLine(item.Name);
}
Console.ReadKey();
#endregion
文件读写
练习
#region //文件读写
//创建文件
if (File.Exists("./Text.txt"))
{
File.Delete("./Text.txt");
File.Create("./Text.txt").Dispose();
}
else
{
File.Create("./Text.txt").Dispose();
}
//WriteReadLines();
// WriteReadText();
File.WriteAllBytes("./Text.txt", Encoding.UTF8.GetBytes("第一张\n第二章\n第三章"));
Console.WriteLine("数据写入完毕");
byte[] bytes = File.ReadAllBytes("./Text.txt");
//解码
string content=Encoding.UTF8.GetString(bytes);
Console.WriteLine(content);
Console.WriteLine("文件读写完毕");
Console.ReadKey();
#endregion
}
private static void WriteReadText()
{
File.WriteAllText("./Text.txt", "c#nice,\n c#good");
Console.WriteLine("数据写输入完毕");
string content = File.ReadAllText("./Text.txt");
Console.WriteLine(content);
Console.WriteLine("数据读取完毕");
}
private static void WriteReadLines()
{
//写入数据
File.WriteAllLines("./Text.txt", new string[] { "第一行", "第二行", "第三行" });
Console.WriteLine("写入数据over");
//读取数据
string[] contents = File.ReadAllLines("./Text.txt");
foreach (var item in contents)
{
Console.WriteLine(item);
}
Console.WriteLine("数据读取完毕");
}
FileStream
练习
#region //FileStream
//定义:该类是c#提供的主要用于进行文件读写的字节流,和File静态类相比该类可以操作大型数据文件
string sourse = "./Text.txt";
string target = "D:/t/photo/Text.txt";
FileStream reader = new FileStream(sourse, FileMode.Open, FileAccess.Read);
FileStream writer = new FileStream(target, FileMode.Create, FileAccess.Write);
byte[] bs = new byte[1024];
int len = 0;
do
{
//读
len = reader.Read(bs, 0, bs.Length);
//写
writer.Write(bs, 0, len);
} while (len > 0);
//关闭
reader.Close();
writer.Close();
//释放资源
reader.Dispose();
writer.Dispose();
Console.ReadKey();
#endregion
StreamReader和StreaWriter
练习
//StreamReader和StreamWriter这两个类是c#提供的字符流类,底层采用字符数组的方式进行
//文件的读写操作,因此只能用于操作文本文件
string sourse = "D:/vs存储/io技术学习/io技术学习/Program.cs";
string target = "D:/src/Program.cs";
using(StreamReader reader=new StreamReader(sourse, Encoding.UTF8))
{
using(StreamWriter writer=new StreamWriter(target, false, Encoding.UTF8))
{
string line = null;
//循环
do
{
//读
line = reader.ReadLine();
//写
writer.WriteLine(line);
} while (!reader.EndOfStream);
}
}
Console.WriteLine("文件读写完毕");
Console.ReadKey();
序列化和反序列化
练习
//使用系统特征进行类的标注,标注后使得该类可以进行序列化操作
[Serializable]
class Player
{
//字段
private string name;
private int age;
private int hp;
//标注该字段不会被序列化到文件去
[NonSerialized]
private string desc = "玩家";
//构造函数
public Player(string name, int age, int hp)
{
this.name = name;
this.age = age;
this.hp = hp;
}
//属性
public string Name { get => name; set => name = value; }
public int Age { get => age; set => age = value; }
public int Hp { get => hp; set => hp = value; }
public string Desc { get => desc; set => desc = value; }
//重写
public override string ToString()
{
return $"[name={this.name}-age={this.age}-hp={this.hp}-dec={this.desc}";
}
}
//序列化:类对象>文件
//反序列化:文件>类对象
//创建类对象
Player player = new Player("哈哈",20,100);
//文件操作
using(FileStream fs=new FileStream("./player.binary", FileMode.OpenOrCreate, FileAccess.Write))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
//序列化
binaryFormatter.Serialize(fs, player);
//结束
Console.WriteLine("序列化over");
}
//反序列化
using(FileStream fs=new FileStream("./player.binary", FileMode.Open, FileAccess.Read))
{
//反序列化
BinaryFormatter binaryFormatter = new BinaryFormatter();
Player obj = binaryFormatter.Deserialize(fs) as Player;
//输出
Console.WriteLine(obj);
Console.WriteLine("反序列化over");
}
Console.ReadKey();