
一、目录和文件的操作关于路径: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、BufferedStreamBufferedStream:缓存区文件读写操作主要把本地数据读取到缓存区里面以后再进行读取时候从缓存区里面进行读取减少对磁盘读写操作读取速度稍微快一点//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); //驱动器的文件类型 NTFSConsole.WriteLine(info.Name); //驱动器名称Console.WriteLine(info.RootDirectory); // 驱动器根目录Console.WriteLine( info.TotalSize); // 驱动器的总大小7、FileInfo文件操作属性说明Existsbool判断文件是否存在Name文件名含后缀不含路径FullName文件完整绝对路径Extension文件后缀如.txtDirectory返回DirectoryInfo文件所在文件夹DirectoryName文件夹路径字符串Length文件大小单位字节 longCreationTime/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 count0) //默认值参数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 item1new 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上级目录 DirectoryInfoExists判断文件夹是否存在boolCreationTime创建时间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 item1new 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.ImageIndex0; item.SubItems.Add(date); item.SubItems.Add(文件夹); listView1.Items.Add(item); } // 获取所有的文件 string[] filesPath Directory.GetFiles(paths); foreach (var path in filesPath) { FileInfo infonew FileInfo(path); string fileName info.Name; string dateinfo.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文件选择对话框FileNameSaveFileDialog文件保存对话框FileNameFolderBrowserDialog文件夹选择对话框SelectedPathColorDialog颜色对话框ColorFontDialog字体对话框FontPrintDialog打印设置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(ListStudent student) { string data JsonConvert.SerializeObject(student, Formatting.Indented); File.WriteAllText(1.txt,data,Encoding.UTF8); } //反序列化读取本地文件 json转集合 public static ListStudent LoadList() { if (!File.Exists(1.txt)) { return new ListStudent(); } string data File.ReadAllText(1.txt,Encoding.UTF8); ListStudent ss JsonConvert.DeserializeObjectListStudent(data); //返回的是个学生列表 return ss ?? new ListStudent(); }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] Ip192.168.215.72 Port50488 Usersa Pwd123123 [Window] Width800 Height600封装 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 (i0iarr.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); }