第二阶段WinFrom-6:文件对话框,对象的本地保存,序列化与反序列化,CSV文件操作,INI文件读写
1_文件对话框
1.1_常用文件对话框以及属性
对话框 | 简介 | 重要属性 |
---|---|---|
OpenFileDialog | 文件选择对话框 | FileName |
SaveFileDialog | 文件保存对话框 | FileName |
FolderBrowserDialog | 文件夹选择对话框 | SelectedPath |
ColorDialog | 颜色对话框 | Color |
FontDialog | 字体对话框 | Font |
PrintDialog | 打印设置 | PrinterSettings |
(2)常用属性
属性名 | 功能说明 |
---|---|
InitialDirectory | 对话框的初始目录 |
Filter | 文件筛选器,按"显示名称|类型"格式编写 例如,"文本文件(.txt)|.txt|所有文件(.)||." |
FileName | 选取的文件的路径 |
Title | 将显示在对话框标题栏中的字符 |
RestoreDirectory | 指示对话框在关闭前是否还原当前目录。 |
CheckPathExists | 在对话框返回之前,检查指定路径是否存在 |
1.2_OpenFileDialog 文件选择对话框
(1)常用方法
属性/方法 | 说明 | |
---|---|---|
InitialDirectory | 设置或获取文件初始打开位置 | |
Filter | 设置或获取能选择的文件类型 | |
Title | 设置或获取对话框的标题 | |
FileName | 获取或获取选择的文件名 |
(2)文件类型
OpenFileDialog openFileDialog = new OpenFileDialog();
//设置文件初始打开位置
openFileDialog.InitialDirectory = @"D:\笔记\02_WinForm";//设置能选择的文件类型
openFileDialog.Filter = "文本文件|*.txt";
//openFileDialog.Filter = "图片|*.gif;*.jpg;*.jpeg;*.bmp;*.jfif;*.png;|文档|*.doc;|Excel|*.xls;*.xlsx";
openFileDialog.Title = "请选择文本";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{Console.WriteLine(openFileDialog.FileName);label1.Text = File.ReadAllText(openFileDialog.FileName);
}
1.3_SaveFileDialog 文件保存对话框
属性/方法 | 说明 |
---|---|
InitialDirectory | 设置或获取文件打开的初始目录 |
Filter | 设置或获取当前可选的文件类型 |
Title | 设置或获取对话框的标题 |
FileName | 获取或获取选择的文件名 |
SaveFileDialog saveFileDialog=new SaveFileDialog();
saveFileDialog.InitialDirectory = @"D:\001\123";
saveFileDialog.Filter = "文本文件|*.txt";
saveFileDialog.Title = "另存为";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{Console.WriteLine(saveFileDialog.FileName);File.Create(saveFileDialog.FileName);label1.Text = File.ReadAllText(saveFileDialog.FileName);}
1.4_FolderBrowserDialog文件夹选择对话框
属性/方法 | 说明 | 值 |
---|---|---|
ShowNewFolderButton 属性 | 设置是否允许用户创建新文件夹。 | |
RootFolder 属性 | 设置对话框的初始浏览位置 | nvironment.SpecialFolder 枚举类型 MyComputer 我的电脑 Desktop 桌面 |
Description 属性 | 向用户显示对话框标题下方的描述性文本 | |
SelectedPath 属性 | 设置或返回用户选择的路径 |
FolderBrowserDialog folderBrowserDialog=new FolderBrowserDialog();
folderBrowserDialog.Description = "选择一个文件夹";
//RootFolder: 可以设置对话框启动时的根目录,主要为C盘里的文件夹,desktop代表桌面
folderBrowserDialog.RootFolder= Environment.SpecialFolder.Desktop;
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{Console.WriteLine(folderBrowserDialog.SelectedPath);
}
1.5_ColorDialog颜色对话框
属性/方法 | 说明 | |
---|---|---|
AllowFullOpen属性 | 该属性用于启用或者禁用“自定义颜色按钮”,该属性为True时,可以自定义颜色 | |
FullOpen属性 | 该属性用于设置ColorDialog对话框打开时是否显示自定义颜色界面 | |
Color属性 | 获取或设置用户选择的颜色 |
ColorDialog colorDialog = new ColorDialog();
colorDialog.AllowFullOpen = false;
if (colorDialog.ShowDialog() == DialogResult.OK)
{Console.WriteLine(colorDialog.Color);label1.ForeColor = colorDialog.Color;
}
1.6_FontDialog 字体对话框
属性 | 说明 | |
---|---|---|
Font属性 | 获取或者设置用户选择的字体 |
1.7_PrinDialog 打印设置 PrinterSettings
2_对象的本地保存
2.1_对象的创建和保存
(1)对象的特点:
对象“生活”在内存空间中,因此,程序一旦关闭,这些对象也都会被CLR的垃圾回收机制销毁。
程序第二次运行时,对象会以“全新”的状态出现,无法保留上次对象的运行状态。
如果希望第二次运行程序时能“重现”第一次运行时对象的“状态”, 则应用程序就必须采用某种方式将对象的各个属性的值保存到磁盘文件中, 这样在需要时可以从磁盘文件中重新设置对象的各个属性值,典型的方法就是使用文本文件保存对象的各个属性值。
2.2_将对象保存在obj文件中以及读取
(1)保存文件
People people = new People()
{Name=textBox1.Text,Age=int.Parse(textBox2.Text),Sex=textBox3.Text,Birth=textBox4.Text,
};
FileStream fileStream = new FileStream("People.obj", FileMode.Create);
StreamWriter sw = new StreamWriter(fileStream);
sw.WriteLine(people.Name);
sw.WriteLine(people.Age);
sw.WriteLine(people.Sex);
sw.WriteLine(people.Birth);
sw.Close();
fileStream.Close();
(2)读取文件
FileStream fileStream = new FileStream("People.obj", FileMode.Open);
StreamReader sr = new StreamReader(fileStream);
People people = new People()
{Name = sr.ReadLine(),Age = int.Parse(sr.ReadLine()),Sex = sr.ReadLine(),Birth = sr.ReadLine(),
};
textBox1.Text=people.Name;
textBox2.Text=people.Age.ToString();
(3)针对上面的存储和读取,顺序是比较重要的,一旦下面的读取顺序错乱(就是存储的顺序和读取的顺序不一致),就会导致数据错乱
3_序列化和反序列化
(1)什么是序列化和反序列化
序列化:序列化是将对象状态转换为可保存或传输的格式的过程,比如转化为二进制、xml、json等的过程。
反序列化:与序列化相对的是反序列化,它将流转换为对象,也就是将在序列化过程中所生成的二进制串、xml、json等转换成数据结构或者对象的过程
(2)序列化的三种方式:二进制序列化,Json序列化,XML序列化
3.1_二进制序列化:BinaryFormatter类
(1)BinaryFormatter 以二进制形式序列化和反序列化对象
Serialize()方法,及那个对象序列化为指定的流
Close(),关闭当前流并释放资源
Deserialize():将指定的流反序列化为对象
(2)对象默认是不可以被序列化的,需要咱们提供一个可以序列化的标识,
[Serializable]特性:作用: 可以序列化的标识
(3)序列化:
//序列化
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();
(4)反序列化
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);
3.2_JSON序列化
(1)JSON 全称“JavaScript Object Notation”,译为“JavaScript 对象简谱”或“JavaScript 对象表示法”,是一种轻量级的、基于文本的、开放的数据交换格式。
数据交换是指,两个设备之间建立连接并互相传递数据的过程。
(2)JSON格式
[] 代表数组,{} 代表对象 Name Age代表属性
[ {"Name":"1","Age":"1","NickName":"1"},{"Name":"1","Age":"1","NickName":"1"}]
(3)DataContractJsonSerializer类:将对象序列化为JSON或将JSON反序列化为对象
创建DataContractJsonSerializer对象时需要传入需要序列化的对象类型
WriteObject()方法:将指定的对象序列化为JSON数据
参数1:文件流,
参数2:需要序列化的对象
ReadObject()方法:以JSON格式读取文档,并返回反序列化对象
(4)序列化
//序列化
People people = new People()
{Name = "张三",Age = 18,Sex = "男",Birth = "12323"
};
//创建文件流
FileStream fileStream = new FileStream("1.json", FileMode.Create);
//实例化DataContractJsonSerializer并传入需要序列化的对象类型
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(People));
jsonSerializer.WriteObject(fileStream, people);
fileStream.Close();
(5)反序列化
FileStream fileStream = new FileStream("1.json", FileMode.Open);
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(People));
People people = jsonSerializer.ReadObject(fileStream) as People;
Console.WriteLine(people.Name);
(6)第三方JsonConvert
1.项目右键-->管理NuGet程序包-->浏览-->搜索Newtonsoft.Json点击下载安装 --->项目引入Newtonsoft.Json;
public void ToJSON2(){People people = new People(){Name = "张三",Age = 18,Sex = "男",Birth = "12323"};//序列化string JsonStr = JsonConvert.SerializeObject(people);File.WriteAllText("1.json", JsonStr);string str = File.ReadAllText("1.json");//public static T? DeserializeObject<T>(string value)People people = JsonConvert.DeserializeObject<People>(str);Console.WriteLine(people.Name);
}
3.3_XML序列化
3.3.1_XML概念:
(1)在网络传输过程中,XML 比较重要,也是一种数据传输格式。在各式各样的程序配置文件中,也经常用 XML 作为配置文件的写法。在 C# 中 XML 也扮演着重要的角色。
(2)什么是 XML
XML 是 eXtensible Markup Language 的缩写, 即可扩展标记语言。
它是一种可以用来创建自定义的标记语言,由万维网协会(W3C)创建,用来克服HTML的局限。
从使用功能上看, XML 主要用于数据的存储,而 HTML 主要用于数据显示。
(3)XML 文档的格式要求
确定且唯一的根元素
开始标签和结束标签匹配
元素标签的正确嵌套
属性值要用引号括起来
同一个元素的属性不能重复
(4)XML 语法要求
元素:
<标签>文本内容</标签>
处理指令:
<?xml version= "1.0"?>
注释:
<!--这是一个XML注释-->
属性:
<salary currency="US$"> 25000 </salary>
3.3.2_序列化和反序列化
(1)XmlSerializer类:在对象和XML之间进行序列化和反序列化操作,实例化的时候需要传入对象的类型
Serialize():将对象序列化为XML,并存入文件流中
Deserialize():将XML文档序列化为object对象
(2)序列化
public void ToXML(){People people = new People(){Name = "张三",Age = 18,Sex = "男",Birth = "12323"};FileStream fileStream = new FileStream("1.xml", FileMode.Create);StreamWriter sw = new StreamWriter(fileStream);XmlSerializer serializer = new XmlSerializer(typeof(People));serializer.Serialize(sw, people);sw.Close();fileStream.Close();}
(3)反序列化
FileStream fileStream = new FileStream("1.xml", FileMode.Open);
StreamReader sr = new StreamReader(fileStream);
XmlSerializer serializer = new XmlSerializer(typeof(People));
People people= serializer.Deserialize(sr) as People;
Console.WriteLine(people.Name);
(4)XML 文件读取总结
常用对象:
XmlDocument 对象表示 XML 整个文档
XmlNode 对象表示 XML 文件的单个节点
常用属性与说明:
对象 | 属性和方法 | 说明 |
---|---|---|
XmlDocument | DocumentElement属性 | 获取根节点 |
ChildNodes属性 | 获取所有子节点 | |
Load()方法 | 读取整个XML的结构 | |
XmlNode | InnerText属性 | 当前节点的值 |
Name属性 | 当前节点的名字 | |
ChildNodes属性 | 当前节点的所有子节点 |
(5)json 和 xml的区别 : 都是数据格式
xml属于重量级别 json是属于轻量级别
xml在传输的过程中比较占宽带, json占宽带少
xml和json 解析方式不一样,xml使用 XMLDocument类 ,Json解析方式可以使用内置的类和第三方类库
4_INI文件操作
(1)INI文件是一种配置文件格式,通常用于Windows操作系统中的应用程序中。它是一种文本文件,由多个节和键值对组成,用于存储应用程序的配置信息。
(2)INI文件的特点包括:
INI文件是一种文本文件,易于编辑和阅读。
INI文件的结构简单,由多个节和键值对组成,易于理解和维护。
INI文件支持多层级节,可以方便地组织和管理配置信息。
INI文件不支持数据类型,所有的键值对都是字符串类型。
INI文件通常用于存储应用程序的配置信息,例如窗口位置、字体大小、数据库连接等。
(3)INI文件是一种简单、易于使用和维护的配置文件格式,适用于存储应用程序的配置信息。
INI文件通常包含多个节(section
),每个节包含多个键值对(key-value pair
)。每个键值对由一个键(key)和一个值(value)组成,中间用等号连接。
[Database]
Server=127.0.0.1
Port=3306
Username=root
Password=123456
Database=mydb
(4)NI文件支持多层级节,可以方便地组织和管理配置信息
例如:在下面的例子中,INI文件包含了两个节,[Database]和[Logging]。
每个节下面包含了多个键值对,分别描述了数据库连接和日志记录的相关信息。
[Database]
Server=127.0.0.1
Port=3306
Username=root
Password=123456
Database=mydb[Logging]
Level=INFO
File=/var/log/myapp.log[相机1]
曝光=50
亮度=100
相机ip=[相机2]
曝光=50
(5)INI文件不支持数据类型,所有的键值对都是字符串类型。
这意味着在读取INI文件时,需要将字符串转换成对应的数据类型,例如整数、浮点数、布尔值等。
总之,INI文件是一种轻量级的配置文件格式,非常适用于存储应用程序的配置信息。
它的结构简单,易于理解和维护,适用于不需要复杂数据类型和结构的场景。
(6)使用步骤
书写App.config 配置 ini文件存放的路径
新建一个存储工具类的文件夹 如: Utility Tool
在Utility 中 新建一个类文件 类文件 中 存放 需要使用的 方法
读取App.config 配置文件中 ini文件的路径
定义读写的方法
自定义INI操作:INIAPI.cs,有很多文件操作方法,后附INI.cs文件
可以直接用,也可如下:复制读写操作,通过复制的读写操作自定义INI文件的读写操作操作
internal class FileIni
{//ConfigurationManager 专门用来读取app.config文件需要引入ystem.Configuration; 命名空间private static string filePath = ConfigurationManager.AppSettings["InIFilePath"].ToString();//写入// kernel32.dll是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。//DllImport 特性:指示非托管动态链接库(DLL)公开为静态入口点的特性方法[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]//MarshalAs指示如何在托管代码和非托管代码之间封送数据[return: MarshalAs(UnmanagedType.Bool)]private static extern bool WritePrivateProfileString(string lpAppName, string lpKeyName, string lpString, string lpFileName);//读取[DllImport("kernel32.dll", CharSet = CharSet.Auto)]private static extern uint GetPrivateProfileString(string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, uint nSize, string lpFileName);//自定义一个写入的方法/// <summary>/// 写入ini文件/// </summary>/// <param name="section">节点名称</param>/// <param name="key">键</param>/// <param name="value">值</param>public static void Write(string section,string key,string value){WritePrivateProfileString(section, key, value, filePath);}/// <summary>/// 读取ini文件/// </summary>/// <param name="section">节点名称</param>/// <param name="key">键</param>/// <returns>值</returns>public static string Read(string section, string key){StringBuilder sb= new StringBuilder();GetPrivateProfileString(section,key,"",sb,255,filePath);return sb.ToString();}
}
(7)自定义了INI文件操作类,直接调用方法
using _06_INI文件操作.Utility;
//写入
FileIni.Write("客户信息", "Name", textBox1.Text);
FileIni.Write("客户信息", "PassWord", textBox2.Text);
//读取
textBox1.Text= FileIni.Read("客户信息", "Name");
textBox2.Text= FileIni.Read("客户信息", "PassWord");
5_CSV文件读写
(1)CSV(Comma Separated Values 逗号分隔值) ,是一种文件格式(如.txt、.doc等),也可理解 .csv 文件就是一种特殊格式的纯文本文件。即是一组字符序列,字符之间用英文字符的逗号或制表符(Tab)分隔。
在 windows 系统环境上 .csv 文件打开方式有多种,如记事本、excel、Notepad++ 等,只要是文本编辑器都能正确打开。
(2)CSV文件格式
CSV文件格式旨在存储表格数据,该数据通常包含行和列。每一行数据代表表格中的一行,每一列代表表格中的一列。CSV文件中每个数据字段之间都使用逗号分隔。每一行以换行符结束。如:
姓名,年龄,性别 小明,20,男 小红,18,女 小华,19,女
(3)CSV文件读写操作:(已经封装CSVAPI文件:"CSVAPI.cs")最后附CSVAPI.cs问价
string path=Directory.GetCurrentDirectory()+"//配置文件";
if (!Directory.Exists(path))
{Directory.CreateDirectory(path);
}string FileName = path + @"\学生信息.csv";
StreamWriter sw = new StreamWriter(FileName);
StringBuilder sb = new StringBuilder();
sb.Append("吴亦凡").Append(",").Append("18").Append(",").Append("男");sw.WriteLine(sb);
sw.Close();
sw.Dispose();
// CSVApi.SaveData();