本篇主要记录C#操作文件
相对路径在项目文件...\bin\Debug 目录下
一、写入读取文件
写入
/// <summary>/// initial 文件写入/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button1_Click(object sender, EventArgs e){//1.创建一个键值对Dictionary<String, Dictionary<string, string>> data = new Dictionary<string, Dictionary<string, string>>();//2.添加数据源data.Add("设备套接字", new Dictionary<string, string>(){{"ip","192.168.21.11" },{"端口","502" }});//3.写入到本地using (StreamWriter streamWriter = new StreamWriter(path,true)){//4.循环写入foreach (string item in data.Keys){//4.1写入键streamWriter.WriteLine($"[{item}]");//5.写入值foreach (string item2 in data[item].Keys){streamWriter.WriteLine($"{item2}={data[item][item2]}");}}}}
读取
/// <summary>/// initial 文件读取/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button2_Click(object sender, EventArgs e){Dictionary<String, Dictionary<string, string>> saveData = new Dictionary<string, Dictionary<string, string>>();string key = null;//配置io流using (StreamReader reader = new StreamReader(path,true)){while (!reader.EndOfStream){//读取string data = reader.ReadLine();//判断是否键if (data.StartsWith("[") && data.EndsWith("]")){key = data.Substring(1, data.Length - 2);saveData.Add(key,new Dictionary<string, string>());}//判断是否是值else if (!string.IsNullOrEmpty(data) && !data.EndsWith(";")){int index = data.IndexOf("=");if (index > 0){//获取值saveData[key].Add(data.Substring(0,index), data.Substring(index+1));}}}}}
二、文件的基本操作
目录操作
/// <summary>/// 创建目录/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button1_Click(object sender, System.EventArgs e){//###一.创建文件夹两种路径方式//1.相对路径地址,项目输出路径,在../bin/Debug目录下Directory.CreateDirectory("log");//在创建的目录中创建子目录Directory.CreateDirectory("log/zhangsan");//2.绝对路径地址,加磁盘符//Directory.CreateDirectory("D:\\c#\\source\\test");// ###2.判断指定路径下是否有该目录if (Directory.Exists("log")){MessageBox.Show("存在");}}/// <summary>/// 删除目录/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button2_Click(object sender, System.EventArgs e){//删除目录,删除的目录必须为空,见构造方法Directory.Delete("log/zhangsan",true);MessageBox.Show(Directory.Exists("log")?"删除成功":"删除失败");}/// <summary>/// 查询子文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button3_Click(object sender, System.EventArgs e){//查询目录下的文件,不是文件夹,文件是带后缀名的,例如:111.txtstring[] files = Directory.GetFiles("log");foreach (var item in files){MessageBox.Show(item);}}
文件流
// FileStream: 文件流 Encoding encoding = Encoding.UTF8;//二进制转换格式/// <summary>/// 写入文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button4_Click(object sender, System.EventArgs e){//第一步:配置文件操作对象string path = "opreationLog.txt";FileMode fileMode = FileMode.Append;FileAccess fileAccess = FileAccess.Write;//初始化IO流对象FileStream fileStream = new FileStream(path, fileMode, fileAccess);//第二步:写入//TODO: 注意这里要加入 \r 才能识别保存换行byte[] data = encoding.GetBytes($"{textBox1.Text}\r\n");fileStream.Write(data,0,data.Length);//关闭IO流 fileStream.Close();}/// <summary>/// 读取文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button5_Click(object sender, System.EventArgs e){//第一步:配置文件操作对象string path = "opreationLog.txt";FileMode fileMode = FileMode.Open;FileAccess fileAccess = FileAccess.Read;//初始化IO流对象FileStream fileStream = new FileStream(path, fileMode, fileAccess);byte[] readBytes = new byte[1024];fileStream.Read(readBytes, 0, 1024);textBox2.Text = encoding.GetString(readBytes);//关闭IO流 fileStream.Close();}
序列化
/// <summary>/// 序列化导出/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button6_Click(object sender, System.EventArgs e){//第一步:配置文件操作对象string path = "save_person.txt";FileMode fileMode = FileMode.Create;FileAccess fileAccess = FileAccess.Write;// 第二步:配置io流对象//using自动管理关闭文件流using (FileStream fileStream = new FileStream(path, fileMode, fileAccess)){//创建序列化对象BinaryFormatter binary = new BinaryFormatter();//获取表格中的数据List<Person> persons = new List<Person>();Person person;for (int i = 0; i < dataGridView1.Rows.Count-1; i++){person = new Person();person.Id = Convert.ToInt32(dataGridView1.Rows[i].Cells[0].Value); person.Name = dataGridView1.Rows[i].Cells[1].Value.ToString(); person.Age = Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value); persons.Add(person);}//开始序列化 binary.Serialize(fileStream,persons);}}/// <summary>/// 序列化导入/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button7_Click(object sender, EventArgs e){//第一步:配置文件操作对象string path = "save_person.txt";FileMode fileMode = FileMode.Open;FileAccess fileAccess = FileAccess.Read;// 第二步:配置io流对象//using自动管理关闭文件流using (FileStream fileStream = new FileStream(path, fileMode, fileAccess)){//创建序列化对象BinaryFormatter binary = new BinaryFormatter();//反序列化Object obj = binary.Deserialize(fileStream);//转换成集合List<Person> people = (List<Person>)obj;//清理表格上的数据 dataGridView1.Rows.Clear();//循环写入foreach (var item in people){dataGridView1.Rows.Add(item.Id, item.Name, item.Age);}}}}[Serializable]class Person{}
三、CSV文件
/// <summary>/// 导入CSV/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button2_Click(object sender, EventArgs e){//第一步:配置IO流操作对象using (StreamReader streamReader = new StreamReader("产品数据.csv")){int index = 0;while(!streamReader.EndOfStream){string data = streamReader.ReadLine();string[] str = data.Split(',');//不插入表头if (index > 0){dataGridView1.Rows.Add(str);}index++;}}}/// <summary>/// 导出CSV/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button1_Click(object sender, EventArgs e){//第一步:配置文件流操作对象using(StreamWriter streamWrite = new StreamWriter("产品数据.csv",false)){//加入表头streamWrite.WriteLine($"{dataGridView1.Columns[0].HeaderText},{dataGridView1.Columns[1].HeaderText},{dataGridView1.Columns[2].HeaderText}");//第二步:循环写入for (int i = 0; i < dataGridView1.Rows.Count -1; i++){streamWrite.WriteLine($"{dataGridView1.Rows[i].Cells[0].Value},{dataGridView1.Rows[i].Cells[1].Value},{dataGridView1.Rows[i].Cells[2].Value}");}}}
四、Excel
/// <summary>/// 导出excel文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button4_Click(object sender, EventArgs e){//第一步:配置Excel文件操作对象using (XLWorkbook xl = new XLWorkbook()){//第二步:创建工作页IXLWorksheet sheet = xl.AddWorksheet("产品数据页1");//第三步:循环添加数据//写入表头for (int i = 0; i < dataGridView1.Columns.Count; i++){//注意Cell 必须从1开始,否则报错sheet.Cell(1, i + 1).Value = dataGridView1.Columns[i].HeaderText;}//写入表格数据for (int i = 0; i < dataGridView2.Rows.Count-1; i++){//第四步:获取第i行列的值for (int j = 0; j < dataGridView2.Rows[i].Cells.Count; j++){//第五步:写入数据sheet.Cell(i+2,j+1).Value = dataGridView2.Rows[i].Cells[j].Value.ToString();}}//第六步:保存到本地xl.SaveAs("数据.xlsx");}}/// <summary>/// 导入Excel文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Button3_Click(object sender, EventArgs e){//第一步:配置Excel文件操作对象using (XLWorkbook xl = new XLWorkbook("数据.xlsx")){//第二步:获取第一个sheet页IXLWorksheet workbook = xl.Worksheet(1);//第三步:获取sheet页中数据 IXLRow row;List<string> list;// 从2开始不要表头for (int i = 2; i <= workbook.Rows().Count(); i++){row = workbook.Row(i);list = new List<string>();for (int j = 1; j <= row.Cells().Count(); j++){string data = workbook.Cell(i, j).Value.ToString();list.Add(data);}dataGridView2.Rows.Add(list);}}}