一、目录和文件的操作
关于路径:
1.建议 路径字符串 使用@""
原因: "" 中\表示 转义 路径中\表示下一级
2.路径的基础知识
相对路径:相对于当前文件路径 不完整的路径 \aaa\bbb\1.txt
绝对路径:完整路径 从盘符开始 F:\aaa\1.txt3.特殊符号
./表示当前目录 ./1.txt 当前目录下的1.txt文件../ 表示上一级目录
../../表示上上级目录
./ 可以省略 ./123.txt ==>123.txt 都是表示当前目录下
1、FileStream 类 (字节数组)
创建一个 FileStream 对象 F 来读取名为 sample.txt 的文件:
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);参数:
FileMode 枚举表示对这个文件的操作。FileMode 枚举的成员有:
Open:打开一个已有的文件。如果文件不存在,则抛出异常。
Create:创建
OpenOrCreate:指定操作系统应打开一个已有的文件。如果文件不存在,则用指定的名称创建一个新的文件打开。
FileAccess:枚举表示对这个文件里面的数据进行的操作,FileAccess枚举的成员有:
Read:对文件的读访问。可从文件中读取数据。同 Write组合即构成读写访问权
Write:文件的写访问。可将数据写入文件。同 Read组合即构成读/写访问权
ReadWrite :读写
//写入功能 //创建一个文件流 //FileMode.Create 如果存在,创建一个新的 覆盖旧的,如果文件不存在,创建一个新的 FileStream file = new FileStream(@"1.txt",FileMode.Create,FileAccess.Write); string info = "后天就回家可以休息了"; byte[] bs = Encoding.Default.GetBytes(info); //写入数据 ,参数1 字节数组,参数2从0位置开始写,参数3 写入的长度 file.Write(bs,0,bs.Length); //关闭写入流 file.Close(); file.Dispose();//释放FileStream fileStream = new FileStream(@"1.txt",FileMode.Open,FileAccess.Read); //每次读取5m的数据存储到内存中,然后保存到字节数组中 byte[] buffer = new byte[1024*1024*5]; //参数1:存放数据的字节数组 //参数2:开始向字节数组存放的位置 //参数3:每次读取的字节的大小 //返回值:本次读取到的有效的字节数,比如读取一个3.5m的数据,虽然空间给的是5m,但是实际上只返回了3.5m int length= fileStream.Read(buffer, 0, buffer.Length); string info = Encoding.Default.GetString(buffer, 0, length); label1.Text = info; fileStream.Close(); fileStream.Dispose();2、BinaryWriter 和 BinaryReader
//1 创建文件流 主要是给BinaryWriter提供一个参数 FileStream file = new FileStream(@"1.txt",FileMode.Create,FileAccess.Write); //2 创建二进制写入对象(写入工具) BinaryWriter bw = new BinaryWriter(file); //3 可以传入其他数据进行直接写入 bw.Write("世界杯中国什么时候进"); //4 关闭文件流 关闭二进制工具 bw.Close(); file.Close(); //5 释放 bw.Dispose(); file.Dispose();FileStream file = new FileStream(@"1.txt",FileMode.Open,FileAccess.Read); BinaryReader br = new BinaryReader(file);// 创建一个二进制读取对象 string ss = br.ReadString(); // 读取字符串类型的数据 this.Text = ss; br.Close(); file.Close(); //5 释放 br.Dispose(); file.Dispose();3、BufferedStream
BufferedStream:缓存区文件读写操作,主要把本地数据读取到缓存区里面,以后再进行读取时候从缓存区里面进行读取,减少对磁盘读写操作,读取速度稍微快一点
//File.Create(@"1.txt") 创建一个文件流 参数文件路径 //1创建一个缓存流对象 BufferedStream buffer = new BufferedStream(File.Create(@"1.txt")); byte[] bs = Encoding.Default.GetBytes("主要把本地数据读取到缓存区里面,"); buffer.Write(bs,0,bs.Length); //写入数据 buffer.Flush();//清空缓存区 buffer.Close();//读取缓存区数据 BufferedStream b1 = new BufferedStream(File.OpenRead(@"1.txt")); byte[] bs = new byte[b1.Length];// 把缓存区长度作为字节数组的长度 //b1.Read(bs, 0, bs.Length) 如果后续有数据的 返回值是大于0 // 如果后续没有数据 值小于0 string ss = ""; while (b1.Read(bs, 0, bs.Length)>0) { ss += Encoding.Default.GetString(bs); Console.WriteLine( Encoding.Default.GetString(bs)); } this.Text = ss; b1.Close();4、File
// File WriteAllText 读写操作 //写入所有的文本 File.WriteAllText(@"1.txt","dsdssdfsfdfddsdd是多少",Encoding.Default); MessageBox.Show( File.ReadAllText(@"1.txt",Encoding.Default));//File.WriteAllLines读写操作 string[] contents = { "张三丰", "杨过" }; File.WriteAllLines(@"2.txt",contents); // 把数组每一个元素进行换行写入 string[] ss = File.ReadAllLines(@"2.txt"); foreach(string s in ss) { MessageBox.Show(s); }//File.WriteAllBytes 读写操作 File.WriteAllBytes(@"3.txt", Encoding.Default.GetBytes("dsdfdf颠三倒四")); MessageBox.Show(Encoding.Default.GetString(File.ReadAllBytes(@"3.txt")));//文件操作 //File.Create(@"4.txt") 创建文件 FileStream streamn = File.Create(@"4.txt"); File.Delete(@"4.txt"); 删除文件操作 //剪切操作 //参数1 资源源路径 //参数2 剪切的目标路径 File.Move(@"4.txt",@"../5.txt"); //复制操作 File.Copy(@"../5.txt", @"6.txt");//判断路径是否有文件 MessageBox.Show(File.Exists(@"6.txt")+""); File.WriteAllText(@"6.txt", "dsdssdfsfdfddsdd是多少"); //追加文本, 返回值为StreamWriter类型 File.AppendText("6.txt") // 第一个参数:文件路径; //第二个参数:要写入的字符串内容; //第三个参数:指定文本编码 UTF8,解决记事本中文乱码问题。 File.AppendAllText(@"1.txt", logText, Encoding.UTF8); //Directory.GetCurrentDirectory() 获取当前debug这一层绝对路径 StreamWriter sw = File.AppendText("6.txt"); sw.Write(Directory.GetCurrentDirectory()); sw.Close();5、StreamReader 和 StreamWriter
//创建写入对象 指定写入路径 StreamWriter sw = new StreamWriter(@"1.txt"); //创建一个写入数据 string[] names = { "张三","李四"}; foreach (string name in names) { sw.WriteLine(name); } sw.Close();//读取 StreamReader sr = new StreamReader(@"1.txt"); string s= sr.ReadToEnd(); MessageBox.Show(s); sr.Close();6、DriveInfo(驱动器操作)
主要获取相关驱动器的 一些信息(驱动器剩余的空间, 驱动器类型等)
DriveInfo info = new DriveInfo(@"c:\");
Console.WriteLine(info.AvailableFreeSpace); //获取剩余空间以 字节位单位
Console.WriteLine(info.DriveType); //驱动器的固定格式
Console.WriteLine(info.DriveFormat); //驱动器的文件类型 NTFS
Console.WriteLine(info.Name); //驱动器名称
Console.WriteLine(info.RootDirectory); // 驱动器根目录
Console.WriteLine( info.TotalSize); // 驱动器的总大小
7、FileInfo(文件操作)
| 属性 | 说明 |
|---|---|
Exists | bool,判断文件是否存在 |
Name | 文件名(含后缀,不含路径) |
FullName | 文件完整绝对路径 |
Extension | 文件后缀,如.txt |
Directory | 返回DirectoryInfo,文件所在文件夹 |
DirectoryName | 文件夹路径字符串 |
Length | 文件大小,单位字节 long |
CreationTime/LastWriteTime/LastAccessTime | 创建、修改、访问时间 |
IsReadOnly | 是否只读 |
//获取文件属性的对象 FileInfo info = new FileInfo(@"C:\Users\Administrator\Desktop\新建文本文档 (2).txt"); Console.WriteLine(info.Attributes); // 一开始默认值 Archive 存档文档, 获取文件的特性 FileInfo info1 = new FileInfo(@"C:\Users\Administrator\Desktop\img"); Console.WriteLine(info1.Attributes);//Directory 目录 文件夹 //设置文件特性 //1 通过FileInfo的属性Attributes进行设置 //info.Attributes = FileAttributes.ReadOnly|FileAttributes.Hidden; //2 通过File的SetAttributes方法进行设置特性 File.SetAttributes(@"C:\Users\Administrator\Desktop\新建 DOC 文档.doc",FileAttributes.Hidden);//设置特性的方法 // File.GetAttributes((@"C:\Users\Administrator\Desktop\新建 DOC 文档.doc") //获取特性的方法 Console.WriteLine(info.FullName);//获取文件完整路径 Console.WriteLine(info.Name);//新建文本文档 (2).txt Console.WriteLine(info.Extension);//.txt Console.WriteLine(info.CreationTime);//文件创建的日期 Console.WriteLine(info.LastWriteTime);//文件上次的修改时间 Console.WriteLine( info.LastAccessTime);//上次访问时间 Console.WriteLine(info.Directory);//C:\Users\Administrator\Desktop Console.WriteLine(info.Exists);//文件是否存在 Console.WriteLine(info.Length); //文件大小8、Path(文件路径)
//Path:提供获取文件或者目录的路径的信息 string filePath = @"C:\Users\Administrator\Desktop\新建 DOC 文档.doc"; string FilePath = @"C:\Users\Administrator\Desktop\img"; Console.WriteLine(Path.GetFullPath(filePath));//绝对路径 Console.WriteLine(Path.GetFullPath(FilePath)); Console.WriteLine(Path.GetFileName(filePath));//获取文件名 带扩展名 Console.WriteLine(Path.GetExtension(filePath));// 获取后缀名 string ss = Path.ChangeExtension(filePath,".jpg"); //修改指定路径后缀名 Console.WriteLine(Path.GetExtension(ss)); string[] s1 = new string[] { "C:\\", "Users", "Administrator", "文档.doc" }; Console.WriteLine(Path.Combine(s1)); //Combine() 把数组里面元素进行连接 拼成一个路径9、Directory(文件目录)
//Directory:目录 或者文件夹 //创建目录 Directory.CreateDirectory(@"C:\Users\Administrator\Desktop\FirstDay"); //获取子目录的文件 string[] paths = Directory.GetFiles(@"C:\Users\Administrator\Desktop\本天知识"); //GetFileSystemEntries 获取子目录下文件和 子目录名称 string[] paths = Directory.GetFileSystemEntries(@"C:\Users\Administrator\Desktop\本天知识"); foreach (string path in paths ) { Console.WriteLine(path); } //当前目录下子目录 string[] files = Directory.GetDirectories(@"C:\Users\Administrator\Desktop\本天知识"); foreach (var item in files) { Console.WriteLine(item); } //删除指定路径下空目录 Directory.Delete(@"C:\Users\Administrator\Desktop\FirstDay\新建文件夹"); //可以删除非空目录 new DirectoryInfo(@"C:\Users\Administrator\Desktop\FirstDay\新建文件夹").Delete(true);//递归遍历文件夹(@"C:\Users\Administrator\Desktop\本天知识"); void 递归遍历文件夹(string path,int count=0) //默认值参数count { if (!Directory.Exists(path)) return; //判断路径是否存在 ,不存在 直接return string s = new string(' ', count);//s字符串 根据count指定前面字符是多少个 //获取Path下的文件 foreach (var item in Directory.GetFiles(path)) { Console.WriteLine($"{s}:{Path.GetFileName(item)}");//Path.GetFileName(item)获取路径下的名称 } //遍历文件下子目录 foreach (var item in Directory.GetDirectories(path)) { //Console.WriteLine(item+"--------"); //如果是文件夹的话 需要执行69-72行代码 把path改成item即可 就是重新调用函数 Console.WriteLine($"文件夹:{Path.GetFileName(item)}"); //打印文件夹的路径 count += 2; 递归遍历文件夹(item,count); } }//展示所有的文件目录 public void ShowDirectory(string path) { //根据目录 创建一个文件信息对象 DirectoryInfo info = new DirectoryInfo(path); //获取目录下所有子目录信息 DirectoryInfo[] infos= info.GetDirectories(); foreach (var item in infos) { // 文件属性 是否 有隐藏的属性 if (item.Attributes.HasFlag(FileAttributes.Hidden)) continue; // 创建项 ListViewItem item1=new ListViewItem(" "+item.Name,0); item1.SubItems.Add(item.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")); item1.SubItems.Add("文件夹"); item1.SubItems.Add(""); listView1.Items.Add(item1); } }10、DirectoryInfo(文件夹操作)
| 属性 | 作用 |
|---|---|
Name | 文件夹名称(不含完整路径) |
FullName | 完整绝对路径 |
Parent | 上级目录 DirectoryInfo |
Exists | 判断文件夹是否存在(bool) |
CreationTime | 创建时间 |
LastWriteTime | 最后修改时间 |
Root | 根目录(如 D:\) |
// 传入文件夹路径 DirectoryInfo dirInfo = new DirectoryInfo(@"D:\test"); dirInfo.Create(); // 递归创建多级目录 dirInfo.CreateSubdirectory("a/b/c"); // 仅空文件夹可删 dirInfo.Delete(); // 强制删除(包含里面所有文件子文件夹) dirInfo.Delete(true); // 移动到新路径,也可用来改名 dirInfo.MoveTo(@"D:\newTest"); //4. 遍历子文件夹 // 获取一级子目录 DirectoryInfo[] subDirs = dirInfo.GetDirectories(); // 模糊匹配 dirInfo.GetDirectories("log*"); // 递归所有子目录 dirInfo.GetDirectories("*", SearchOption.AllDirectories); //5. 遍历文件夹内文件 FileInfo[] files = dirInfo.GetFiles(); // 只取txt文件 dirInfo.GetFiles("*.txt"); // 递归查找所有子文件夹文件 dirInfo.GetFiles("*.pdf", SearchOption.AllDirectories);11、运用
//展示所有的文件目录 public void ShowDirectory(string path) { //根据目录 创建一个文件信息对象 DirectoryInfo info = new DirectoryInfo(path); //获取目录下所有子目录信息 DirectoryInfo[] infos= info.GetDirectories(); foreach (var item in infos) { // 文件属性 是否 有隐藏的属性 if (item.Attributes.HasFlag(FileAttributes.Hidden)) continue; // 创建项 ListViewItem item1=new ListViewItem(" "+item.Name,0); item1.SubItems.Add(item.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")); item1.SubItems.Add("文件夹"); item1.SubItems.Add(""); listView1.Items.Add(item1); } }//展示所有的文件 public void ShowFile(string path) { //根据目录 创建一个文件信息对象 DirectoryInfo info = new DirectoryInfo(path); //获取目录下所有文件信息 FileInfo[] infos = info.GetFiles(); foreach (var item in infos) { // 文件属性 是否 有隐藏的属性 if (item.Attributes.HasFlag(FileAttributes.Hidden)) continue; ListViewItem item1 = new ListViewItem(" " + item.Name, 1); item1.SubItems.Add(item.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss")); item1.SubItems.Add("文件"); item1.SubItems.Add(item.Length / 1024 +"Kb"); listView1.Items.Add(item1); } }private void LoadData(string paths) { listView1.Columns.Clear(); listView1.Columns.Add("名称",200); listView1.Columns.Add("修改日期",240); listView1.Columns.Add("类型",200); listView1.Columns.Add("大小",-2); listView1.SmallImageList = imageList1; // 绑定小图标集合 listView1.LargeImageList = imageList1; // 绑定大图标集合 // 获取所有的 文件夹 string[] foldersPath = Directory.GetDirectories(paths); foreach (var path in foldersPath) { FileInfo info =new FileInfo(path); string foldersName = info.Name; //获取文件夹名字 string date= info.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"); // 获取上次修改时间 ListViewItem item = new ListViewItem(foldersName); item.ImageIndex=0; item.SubItems.Add(date); item.SubItems.Add("文件夹"); listView1.Items.Add(item); } // 获取所有的文件 string[] filesPath = Directory.GetFiles(paths); foreach (var path in filesPath) { FileInfo info=new FileInfo(path); string fileName =info.Name; string date=info.LastWriteTime.ToString("yyyy-MM-dd mm:ss"); long length= info.Length; string size = (Math.Round((double)length / 1024) ).ToString("0")+"Kb"; ListViewItem item = new ListViewItem(fileName); item.ImageIndex = 1; item.SubItems.Add(date); item.SubItems.Add("文件"); item.SubItems.Add(size); listView1.Items.Add(item); } }二、文件对话框
| 对话框 | 简介 | 重要属性 |
|---|---|---|
| OpenFileDialog | 文件选择对话框 | FileName |
| SaveFileDialog | 文件保存对话框 | FileName |
| FolderBrowserDialog | 文件夹选择对话框 | SelectedPath |
| ColorDialog | 颜色对话框 | Color |
| FontDialog | 字体对话框 | Font |
| PrintDialog | 打印设置 | PrinterSettings |
常用属性表:
| 属性名 | 功能说明 |
|---|---|
| InitialDirectory | 对话框的初始目录 |
| Filter | 文件筛选器,按"显示名称|类型"格式编写 例如,"文本文件(.txt)|.txt|所有文件(.)||." |
| FileName | 选取的文件的路径 |
| Title | 将显示在对话框标题栏中的字符 |
| RestoreDirectory | 指示对话框在关闭前是否还原当前目录。 |
| CheckPathExists | 在对话框返回之前,检查指定路径是否存在 |
1、OpenFileDialog 文件选择对话框
private void button1_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.InitialDirectory = "F:\\C#软件开发7班"; openFileDialog.Filter = "文本文件|*.txt|图片|*.jpg"; openFileDialog.Title = "请选择文本"; if (openFileDialog.ShowDialog()==DialogResult.OK) { Console.WriteLine(openFileDialog.FileName); label1.Text = File.ReadAllText(openFileDialog.FileName); } }2、SaveFileDialog 文件保存对话框3、
private void button2_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.InitialDirectory = "F:\\C#软件开发7班"; saveFileDialog.Filter = "文本文件|*.txt"; saveFileDialog.Title = "另存为"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { Console.WriteLine(saveFileDialog.FileName); File.Create(saveFileDialog.FileName); } }3、FolderBrowserDialog文件夹选择对话框
ShowNewFolderButton 属性:设置是否允许用户创建新文件夹。
RootFolder 属性:设置对话框的初始浏览位置。
Environment.SpecialFolder 枚举类型
MyComputer 我的电脑
Desktop 桌面
Description 属性:向用户显示对话框标题下方的描述性文本。
SelectedPath 属性:设置或返回用户选择的路径。
private void button3_Click(object sender, EventArgs e) { FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog(); folderBrowserDialog.Description = "选择一个文件夹"; folderBrowserDialog.RootFolder = Environment.SpecialFolder.Desktop; if (folderBrowserDialog.ShowDialog() == DialogResult.OK) { Console.WriteLine(folderBrowserDialog.SelectedPath); } }4、ColorDialog 颜色对话框
AllowFullOpen属性: 该属性用于启用或者禁用“自定义颜色按钮”,该属性为True时,可以自定义颜色
FullOpen属性:该属性用于设置ColorDialog对话框打开时是否显示自定义颜色界面
private void button4_Click(object sender, EventArgs e) { ColorDialog colorDialog = new ColorDialog(); colorDialog.AllowFullOpen = false; if (colorDialog.ShowDialog() == DialogResult.OK) { Console.WriteLine(colorDialog.Color); label1.ForeColor = colorDialog.Color; } }5、FontDialog 字体对话框
private void button5_Click(object sender, EventArgs e) { FontDialog fontDialog = new FontDialog(); if (fontDialog.ShowDialog()==DialogResult.OK) { label1.Font = fontDialog.Font; } }三、序列化和反序列化
1、二进制序列化
public partial class Form1 : Form { public Form1() { InitializeComponent(); ToBinaryFormatter(); } public void ToBinaryFormatter() { //序列化 People people = new People() { Name = "吴亦凡", Age = 18, Sex = "男", Birth = "12323" }; 1.创建文件流 FileStream fs = new FileStream("1.txt", FileMode.Create); 2.创建一个二进制序列化格式器 BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, people); fs.Close(); //反序列化 FileStream fs = new FileStream("1.txt", FileMode.Open); BinaryFormatter bf = new BinaryFormatter(); People people= bf.Deserialize(fs) as People; fs.Close(); Console.WriteLine(people.Name); } }2、JSON序列化
//序列化:集合转成Json public static void SaveList(List<Student> student) { string data= JsonConvert.SerializeObject(student, Formatting.Indented); File.WriteAllText(@"1.txt",data,Encoding.UTF8); } //反序列化:读取本地文件 ,json转集合 public static List<Student> LoadList() { if (!File.Exists(@"1.txt")) { return new List<Student>(); } string data= File.ReadAllText("1.txt",Encoding.UTF8); List<Student> ss= JsonConvert.DeserializeObject<List<Student>>(data); //返回的是个学生列表 return ss ?? new List<Student>(); }3、XML序列化
把实体类对象直接保存为 XML 文本,读取时自动还原对象,常用于配置、数据导出存储。
// 实例对象 User user = new User { Id = 1, Name = "张三", IsEnable = true, Price = 99.99m }; // 序列化器 XmlSerializer ser = new XmlSerializer(typeof(User)); using (FileStream fs = new FileStream("user.xml", FileMode.Create)) { ser.Serialize(fs, user); } XmlSerializer ser = new XmlSerializer(typeof(User)); using (FileStream fs = new FileStream("user.xml", FileMode.Open)) { User u = (User)ser.Deserialize(fs); } // 标记可序列化 [XmlRoot("User")] public class User { public int Id { get; set; } public string Name { get; set; } public bool IsEnable { get; set; } public decimal Price { get; set; } // 必须有无参数构造函数 public User() { } }4、INI文件操作
INI 格式示例(config.ini)
[DB] Ip=192.168.215.72 Port=50488 User=sa Pwd=123123 [Window] Width=800 Height=600封装 Win32 API 工具类(直接复制) using System.Runtime.InteropServices; public class IniHelper { // 写入INI [DllImport("kernel32")] private static extern long WritePrivateProfileString(string section, string key, string val, string filePath); // 读取INI [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath); private string _iniPath; public IniHelper(string path) { _iniPath = path; } // 写值 public void Write(string section, string key, string value) { WritePrivateProfileString(section, key, value, _iniPath); } // 读值 public string Read(string section, string key, string defaultValue = "") { StringBuilder sb = new StringBuilder(256); GetPrivateProfileString(section, key, defaultValue, sb, 256, _iniPath); return sb.ToString(); } }IniHelper ini = new IniHelper(Application.StartupPath + "\\config.ini"); // 写入数据库配置 ini.Write("DB", "Ip", "192.168.215.72"); ini.Write("DB", "Port", "50488"); // 读取 string dbIp = ini.Read("DB", "Ip"); int port = int.Parse(ini.Read("DB", "Port"));5、CSV文件读写
CSV 特征:逗号分隔一行数据,首行常为表头,纯文本轻量化导出表格。
//封装 CSVAPI 方法 public class CSVAPI { public static void SaveData(string name, string age, string sex) { //获取存储文件的目录路径 string dirPath = Directory.GetCurrentDirectory() + @"\data"; if (!Directory.Exists(dirPath)) //如果debug下没有data目录 { //创建目录 Directory.CreateDirectory(dirPath); } //获取文件路径 string filePath = dirPath + @"\1.csv"; if (!File.Exists(filePath)) //判断1.csv是否存在 { //姓名,年龄,性别 //写入表头数据 FileStream fs = new FileStream(filePath,FileMode.Create,FileAccess.Write); StreamWriter sw = new StreamWriter(fs,Encoding.Default); //写入对象 StringBuilder sb = new StringBuilder(); sb.Append("姓名").Append(",").Append("年龄").Append(",").Append("性别"); sw.WriteLine(sb); sw.Close(); fs.Close(); sw.Dispose(); fs.Dispose(); } //写入内容数据 using (StreamWriter sw = new StreamWriter(filePath,true,Encoding.Default)) { StringBuilder sb = new StringBuilder(); sb.Append(name).Append(",").Append(age).Append(",").Append(sex); sw.WriteLine(sb); } } public static string ReadData() { string dirPath = Directory.GetCurrentDirectory() + @"\data"; if (!Directory.Exists(dirPath)) //如果debug下没有data目录 { //创建目录 Directory.CreateDirectory(dirPath); } string filePath = dirPath + @"\1.csv"; StreamReader sr = new StreamReader(filePath,Encoding.Default); string ss = sr.ReadToEnd(); // 读取数据直到最后 sr.Close(); sr.Dispose(); return ss; } }// 保存 private void button1_Click(object sender, EventArgs e) { CSVAPI.SaveData("梅西","20","男"); } // 读取 private void button2_Click(object sender, EventArgs e) { string data = CSVAPI.ReadData(); string[] arr = data.Split('\n'); string[] newArr = new string[arr.Length-2]; for (int i = 0; i < arr.Length; i++) { if (i>0&&i<arr.Length-1) { newArr[i - 1] = arr[i]; } } foreach (string item in newArr) { string[] arr1 = item.Split(','); foreach (var item1 in arr1) { MessageBox.Show(item1); } } }6、setting
一、打开配置界面
项目右键 → 添加→设置文件→添加键值:
//写入 private void button1_Click(object sender, EventArgs e) { Settings set = Settings.Default;// 获取默认的setting 对象 set.name = "李四"; set.age = 40; set.sex = true; set.Save();//保存数据 } // 读取 private void button2_Click(object sender, EventArgs e) { Settings set = Settings.Default;// 获取默认的setting 对象 MessageBox.Show(set.name); }