我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#怎么开发Winform实现文件操作

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#怎么开发Winform实现文件操作

这篇文章主要介绍了C#怎么开发Winform实现文件操作的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么开发Winform实现文件操作文章都会有所收获,下面我们一起来看看吧。

    一、文件对话框

    C#中共有三种文件对话框,分别用于不同的功能:

    • (1)用于打开文件的对话框OpenFileDialog。

    • (2)用于保存文件的对话框SaveFileDialog。

    • (3)打开文件夹的对话框FolderBroswerDialog。

    示例:如下图,点击三个按钮分别弹出三种对话框,进行相应操作之后,将路径在文本框中显示:

    C#怎么开发Winform实现文件操作

    (1)OpenFileDialog对话框

    修改OpenFileDialog对话框的Name属性为ofDlg。在“打开”按钮添加ofDlg.ShowDialog(); 界面如下:

    C#怎么开发Winform实现文件操作

    通过ShowDialog()的返回值,判断点击的是“打开”还是“取消”。在“打开”按钮点击事件中编写如下代码:

    private void btnOpen_Click(object sender, EventArgs e){    //判断是否点击的“打开”按钮    if (ofDlg.ShowDialog() == DialogResult.OK)    {        txtPath.Text = ofDlg.FileName;}}

    OpenFileDialog常用属性表:

    属性名功能说明
    InitialDirectory对话框的初始目录
    Filter文件筛选器,按"显示名称|类型"格式编写 例如,"文本文件(.txt)|.txt|所有文件(.)||."
    FilterIndex在对话框中选择的文件筛选器的索引,如果选第一项就设为1
    FileName第一个在对话框中显示的文件或最后一个选取的文件
    Title将显示在对话框栏中的字符
    CheckFileExists在用户指定不存在的文件时是否显示警告
    CheckPathExists在对话框返回之前,检查指定路径是否存在

    (2)SaveFileDialog对话框

    保存文件对话框常用于软件中的“另存为”功能。其常用属性、方法及使用方式与打开文件对话框相同。

    设置保存文件对话框的Filter属性为“文本文件|*.txt”。在“保存”按钮的点击事件中编写如下代码:

    private void btnSave_Click(object sender, EventArgs e){    if (sfDlg.ShowDialog() == DialogResult.OK)    {        txtPath.Text = sfDlg.FileName;    }}

    (3)FolderBroswerDialog对话框

    浏览文件夹对话框常用于浏览文件夹,选择文件夹路径。

    在“浏览”按钮的点击事件中编写如下代码:

    private void btnBrowse_Click(object sender, EventArgs e){    if (fbDlg.ShowDialog() == DialogResult.OK)    {        txtPath.Text = fbDlg.SelectedPath;    }}

    FolderBroswerDialog常用属性:

    属性名能说明功
    Description显示在对话框的树视图上方的字符串,用来指定显示给用户的指导信息
    RootFolder设置根文件夹位置
    SelectedPath对话框中最先选择的文件夹或用户最后选择的文件夹完整路径
    ShowNewFold对话框中是否包括“新建文件夹”按钮

    二、文件及文件夹操作

    文件及文件夹管理是操作系统的重要组成部分,主要包括创建、移动、复制和删除等操作。

    Directory类和DirectoryInfo类用于对磁盘和文件夹的操作管理。

    File类和FileInfo类用于对文件进行常用操作管理。

    (1)文件常用操作

    在C#中如果对文件进行创建、复制和删除等少量操作一般使用File类。

    File类是静态类,其中所有方法都是静态的,通过类名直接调用,不需要实例化。

    示例,如下图,进行文件的基本操作:

    C#怎么开发Winform实现文件操作

    点击"选择文件"按钮选择某个文件,并将文件路径在文本框显示。

    点击"选择文件夹"按钮选择某个文件夹,并将文件夹路径在文本框显示。

    点击"复制文件"按钮,实现将文件复制到文件夹中。

    点击"移动文件"按钮,实现将文件移动到文件夹中。

    点击"删除文件"按钮,实现将文件删除。

    其中,"选择文件"按钮name=btOpenFile,"选择文件夹"按钮name=btOpenFolder,"复制文件"按钮name=btCopy,"移动文件"按钮name=btMove,"删除文件"按钮name=btDelete。

    存放文件名的文本框name=txtFile,存放文件夹名的文本框name=txtFolder。

    文件对话框name=openFileDialog1,文件夹对话框name=folderBrowserDialog1。

    File类实现代码如下:

    //选择文件按钮private void btOpenFile_Click(object sender, EventArgs e){    if (this.openFileDialog1.ShowDialog() == DialogResult.OK)    {        //FileName包含路径,SafeFileName不包含路径        this.txtFile.Text = this.openFileDialog1.FileName;    }}//选择文件夹按钮private void btOpenFolder_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {        this.txtFolder.Text = this.folderBrowserDialog1.SelectedPath;    }}//复制文件按钮private void btCopy_Click(object sender, EventArgs e){    if (!File.Exists(this.txtFile.Text))    {        MessageBox.Show("文件不存在!");        return;    }    if (!Directory.Exists(this.txtFolder.Text))    {        MessageBox.Show("文件夹不存在!");        return;    }    string[] arrName = this.txtFile.Text.Split('\\');    string name = arrName[arrName.Length - 1];    //第三个参数true代表文件存在直接覆盖    //如果希望不覆盖,此处添加代码判断文件已经存在给出提示    File.Copy(this.txtFile.Text, this.txtFolder.Text + "\\" + name,true);    MessageBox.Show("复制成功!");}//移动文件private void btMove_Click(object sender, EventArgs e){    if (!File.Exists(this.txtFile.Text))    {        MessageBox.Show("文件不存在!");        return;    }    if (!Directory.Exists(this.txtFolder.Text))    {        MessageBox.Show("文件夹不存在!");        return;    }    string[] arrName = this.txtFile.Text.Split('\\');    string name = arrName[arrName.Length - 1];    string newFileName = this.txtFolder.Text + "\\" + name;    if (File.Exists(newFileName))    {        //方案一:提示用户有重名文件        //MessageBox.Show("目标位置有重名文件!");        //return;        //方案二:直接将目标文件删除        File.Delete(newFileName);    }    File.Move(this.txtFile.Text, newFileName);    MessageBox.Show("移动成功!");}//删除文件private void btDelete_Click(object sender, EventArgs e){    if (!File.Exists(this.txtFile.Text))    {        MessageBox.Show("文件不存在!");        return;    }    File.Delete(this.txtFile.Text);    MessageBox.Show("删除成功!");}

    和FileInfo类相比,使用File类可以避免频繁创建和释放对象的系统开销,但如果需要多次重用某个文件对象,则使用FileInfo类。

    下面使用FileInfo类实现相同功能,代码如下:

    //选择文件按钮private void btOpenFile_Click(object sender, EventArgs e){    if (this.openFileDialog1.ShowDialog() == DialogResult.OK)    {        //FileName包含路径,SafeFileName不包含路径        this.txtFile.Text = this.openFileDialog1.FileName;    }}//选择文件夹按钮private void btOpenFolder_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {        this.txtFolder.Text = this.folderBrowserDialog1.SelectedPath;    }}//复制文件private void btCopy_Click(object sender, EventArgs e){    FileInfo fInfo = new FileInfo(this.txtFile.Text);    if (fInfo.Exists == false)    {        MessageBox.Show("文件不存在!");        return;    }    DirectoryInfo dInfo = new DirectoryInfo(this.txtFolder.Text);    if (dInfo.Exists == false)    {        MessageBox.Show("文件夹不存在!");        return;    }    string[] arrName = this.txtFile.Text.Split('\\');    string name = arrName[arrName.Length - 1];    //第二个参数true代表文件存在直接覆盖    fInfo.CopyTo(this.txtFolder.Text + "\\" + name, true);    MessageBox.Show("复制成功!");}//移动文件private void btMove_Click(object sender, EventArgs e){    FileInfo fInfo = new FileInfo(this.txtFile.Text);    if (fInfo.Exists == false)    {        MessageBox.Show("文件不存在!");        return;    }    DirectoryInfo dInfo = new DirectoryInfo(this.txtFolder.Text);    if (dInfo.Exists == false)    {        MessageBox.Show("文件夹不存在!");        return;    }    string[] arrName = this.txtFile.Text.Split('\\');    string name = arrName[arrName.Length - 1];    string newFileName = this.txtFolder.Text + "\\" + name;    FileInfo deskFile = new FileInfo(newFileName);    if (deskFile.Exists == true)    {        //方案一:提示用户有重名文件        //MessageBox.Show("目标位置有重名文件!");        //return;        //方案二:直接将目标文件删除        deskFile.Delete();    }    fInfo.MoveTo(newFileName);    MessageBox.Show("移动成功!");}//删除文件private void btDelete_Click(object sender, EventArgs e){    FileInfo fInfo = new FileInfo(this.txtFile.Text);    if (fInfo.Exists == false)    {        MessageBox.Show("文件不存在!");        return;    }    fInfo.Delete();    MessageBox.Show("删除成功!");}

    (2)文件夹常用操作

    Directory类是静态类,其中所有方法都是静态的,通过类名直接调用。

    示例,如下图,进行文件夹的基本操作:

    C#怎么开发Winform实现文件操作

    点击"选择文件夹一"按钮,选择文件夹,并把文件夹路径显示在第一个文本框。

    点击"选择文件夹二"按钮,选择文件夹,并把文件夹路径显示在第二个文本框。

    点击"移动文件夹"按钮,将第一个文本框路径的文件夹移动到第二个文本框路径的文件夹下。

    点击"删除文件夹"按钮,将第一个文本框路径的文件夹进行删除。

    其中"选择文件夹一"按钮name=btOpen1,"选择文件夹二"按钮name=btOpen2,"移动文件夹"按钮name=btMove,"删除文件夹"按钮name=btDelete。

    第一个文本框name=txtFolder1,第二个文本框name=txtFolder2。

    文件对话框name=openFileDialog1,文件夹对话框name=folderBrowserDialog1。

    Directory实现代码如下:

    //选择文件夹一private void btOpen1_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {        this.txtFolder1.Text = this.folderBrowserDialog1.SelectedPath;    }}//选择文件夹二private void btOpen2_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {        this.txtFolder2.Text = this.folderBrowserDialog1.SelectedPath;    }}//移动文件夹private void btMove_Click(object sender, EventArgs e){    if (!Directory.Exists(this.txtFolder1.Text) || !Directory.Exists(this.txtFolder2.Text))    {        MessageBox.Show("文件夹不存在!");        return;    }    //获取文件夹名称    string[] arrFolderName = this.txtFolder1.Text.Split('\\');    string folderName = arrFolderName[arrFolderName.Length - 1];    string newFolderName = this.txtFolder2.Text + "\\" + folderName;    //判断目标地址是否已经有该文件夹了    if (Directory.Exists(newFolderName))    {        //方案一:给出提示        //MessageBox.Show("在目标位置,该文件夹已经存在了");        //return;        //方案二:删除目标位置的文件夹        Directory.Delete(newFolderName,true);    }    //此移动操作只能在同一个根盘符上操作    Directory.Move(this.txtFolder1.Text, newFolderName);    MessageBox.Show("移动文件夹成功!");}private void btDelete_Click(object sender, EventArgs e){    if (!Directory.Exists(this.txtFolder1.Text))    {        MessageBox.Show("文件夹不存在!");        return;    }    //第二个参数代表删除所有的子文件夹和文件    Directory.Delete(this.txtFolder1.Text, true);    MessageBox.Show("删除文件夹成功!");}

    同样上述功能,使用DirectoryInfo实现如下:

    //选择文件夹一private void btOpen1_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {        this.txtFolder1.Text = this.folderBrowserDialog1.SelectedPath;    }}//选择文件夹二private void btOpen2_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {        this.txtFolder2.Text = this.folderBrowserDialog1.SelectedPath;    }}//移动文件夹private void btMove_Click(object sender, EventArgs e){    DirectoryInfo startInfo = new DirectoryInfo(this.txtFolder1.Text);    DirectoryInfo endInfo = new DirectoryInfo(this.txtFolder2.Text);    if (startInfo.Exists == false || endInfo.Exists == false)    {        MessageBox.Show("文件夹不存在");        return;    }    string[] arrFolderName = this.txtFolder1.Text.Split('\\');    string folderName = arrFolderName[arrFolderName.Length - 1];    string newFolderName = this.txtFolder2.Text + "\\" + folderName;    //判断目标地址是否已经有该文件夹了    DirectoryInfo tmp = new DirectoryInfo(newFolderName);    if (tmp.Exists == true)    {        //方案一:给出提示        //MessageBox.Show("在目标位置,该文件夹已经存在了");        //return;        //方案二:删除目标位置的文件夹        tmp.Delete(true);    }    //此移动操作只能在同一个根盘符上操作    startInfo.MoveTo(newFolderName);    MessageBox.Show("移动成功!");}private void btDelete_Click(object sender, EventArgs e){    DirectoryInfo startInfo = new DirectoryInfo(this.txtFolder1.Text);    if (startInfo.Exists == false)    {        MessageBox.Show("文件夹不存在");        return;    }    //参数代表删除所有的子文件夹和文件    startInfo.Delete(true);    MessageBox.Show("删除文件夹成功!");}

    (3)文件夹的复制和移动

    关于文件夹的移动,系统提供给我们的功能,只能在同一个根盘符上操作。

    关于文件夹的复制,系统根本就没有提供相应的API。

    所以关于文件夹的复制以及文件移动跨磁盘只能自己写,自己实现了,如图:

    C#怎么开发Winform实现文件操作

    点击"选择文件夹一"按钮:可以选择一个文件夹,并且将文件夹的路径显示在第一个文本框。

    点击"选择文件夹二"按钮:可以选择一个文件夹,并且将文件夹的路径显示在第二个文本框。

    点击"复制文件夹"按钮:将第一个文件夹及文件夹内容复制到第二个文件夹中。

    点击"移动文件夹"按钮:将第一个文件夹及文件夹内容移动到第二个文件夹中。

    其中:"选择文件夹一"按钮name=btOpen1,"选择文件夹二"按钮name=btOpen2,"复制文件夹"按钮name=btCopy,"移动文件夹"按钮name=btMove。

    第一个文本框name=txtFolder1,第二个文本框name=txtFolder2。

    文件对话框name=openFileDialog1,文件夹对话框name=folderBrowserDialog1。

    具体实现代码如下:

    编写通用的递归方法,实现文件夹的复制:

    //endFolderPath为处理之后的目标路径//例如将"C:\abc"复制到"D:123\",endFolderPath需要传递处理之后的"D:123\abc"private void CopyFolder(string startFolderPath, string endFolderPath){    //在创建目标文件夹    Directory.CreateDirectory(endFolderPath);    DirectoryInfo startDir = new DirectoryInfo(startFolderPath);    //循环复制文件夹下的所有文件    foreach (FileInfo item in startDir.GetFiles())    {        File.Copy(item.FullName, endFolderPath + "\\" + item.Name);    }    //循环所有子文件夹形成递归调用    foreach (DirectoryInfo item in startDir.GetDirectories())    {        string startPath = item.FullName;        string newFolderName = endFolderPath + "\\" + item.Name;        CopyFolder(startPath, newFolderName);    }}

    各个按钮的代码如下:

    private void btOpen1_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {    this.txtFolder1.Text = this.folderBrowserDialog1.SelectedPath;    }}private void btOpen2_Click(object sender, EventArgs e){    if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)    {    this.txtFolder2.Text = this.folderBrowserDialog1.SelectedPath;    }}//复制文件夹private void btCopy_Click(object sender, EventArgs e){    if (!Directory.Exists(this.txtFolder1.Text) || !Directory.Exists(this.txtFolder2.Text))    {        MessageBox.Show("文件夹不存在!");        return;    }    string[] arrFolderName = this.txtFolder1.Text.Split('\\');    string folderName = arrFolderName[arrFolderName.Length - 1];    string newFolderName = this.txtFolder2.Text + "\\" + folderName;    //判断目标地址是否已经有该文件夹了    if (Directory.Exists(newFolderName))    {        //方案一:给出提示        //MessageBox.Show("在目标位置,该文件夹已经存在了");        //return;        //方案二:删除目标位置的文件夹        Directory.Delete(newFolderName, true);    }    CopyFolder(this.txtFolder1.Text, newFolderName);    MessageBox.Show("复制成功!");}//移动文件夹private void btMove_Click(object sender, EventArgs e){    if (!Directory.Exists(this.txtFolder1.Text) || !Directory.Exists(this.txtFolder2.Text))    {        MessageBox.Show("文件夹不存在!");        return;    }    string[] arrFolderName = this.txtFolder1.Text.Split('\\');    string folderName = arrFolderName[arrFolderName.Length - 1];    string newFolderName = this.txtFolder2.Text + "\\" + folderName;    //判断目标地址是否已经有该文件夹了    if (Directory.Exists(newFolderName))    {        //方案一:给出提示        //MessageBox.Show("在目标位置,该文件夹已经存在了");        //return;        //方案二:删除目标位置的文件夹        Directory.Delete(newFolderName, true);    }    CopyFolder(this.txtFolder1.Text, newFolderName);    //复制完成后,删除原始位置的文件夹    Directory.Delete(this.txtFolder1.Text, true);    MessageBox.Show("移动成功!");}

    三、读写文本文件

    文件和流的概念:

    --文件是在各种媒质上永久存储的数据的有序集合。它是进行数据读写操作的基本对象。

    --流是一种向存储器读取和写入字节的方式,也是进行数据读写操作的基本对象。

    --流提供了连续的字节流存储空间,其实际存储位置可以不连续。

    --C#中所有表示流的类都继承于抽象类Stream。

    读写文本文件最常用的类有:

    --FileStream(文件流)

    --StreamReader(流读取器)

    --StreamWriter(流写入器)

    读写文件操作的基本步骤为:
    • 创建文件流

    • 创建读、写器

    • 执行读、写操作

    • 关闭读写器

    • 关闭文件流

    文件流对象:

    实例化文件流对象语法如下:

    FileStream fs = new FileStream(FileName, FileMode,FileAccess);

    其中FileMode的枚举值如下:

    值名称功能说明
    CreateNew创建新文件,如果文件已存在则引发异常
    Create创建新文件,如果文件已存在则覆盖
    Open打开文件,如果文件不存在则引发异常
    OpenOrCreate打开文件,如果文件不存在则创建新文件
    Append打开文件并查找到文件尾,如果文件不存在则创建新文件
    Truncate打开现在文件并清除其内容,如果文件不存在则引发异常

    其中FileAccess的枚举值如下:

    值名称功能说明
    Read对文件进行只读访问
    Write对文件进行只写访问
    ReadWrite对文件进行读写访问
    文件读写器常用方法:

    StreamReader的常用方法:

    值名称功能说明
    Read读取输入流中的下一个(组)字符
    ReadLine读取当前流中的一行字符,并将数据作为字符串返回
    ReadToEnd读取从当前位置到末尾的所有字符,并将数据作为字符串返回
    Close关闭StreamReader对象和基础流,并释放与读取器关联的所有系统资源

    StreamWriter的常用方法:

    值名称功能说明
    Write将数据写入流
    WriteLine将行结束符之前的数据写入流
    Close关闭StreamWriter对象和基础流

    示例:如下图,编写一个文本文件读写器

    C#怎么开发Winform实现文件操作

    --点击"打开文件"按钮,选择一个文本文件,并且将文本文件路径显示在上面单行文本框中,将文本文件的内容显示在下面的多行文本框中。

    --多行文本框,可以进行修改其文本内容。

    --点击"保存文件"按钮,将多行文本框的文本保存到打开的文本文件中。

    其中"打开文件"按钮name=btOpen,"保存文件"按钮name=btSave,单行文本框name=txtFilePath,多行文本框name=txtContent。

    实现代码如下:

    private void btOpen_Click(object sender, EventArgs e){    OpenFileDialog dialog = new OpenFileDialog();    DialogResult result = dialog.ShowDialog();    //点击打开按钮之后    if (result == System.Windows.Forms.DialogResult.OK)    {        this.txtFilePath.Text = dialog.FileName;    }    else    {    return;    }        //方案一:使用Filestream将文本一次性全部转换为字节数组,之后转换为string    //FileStream fs = new FileStream(this.txtFilePath.Text, FileMode.Open, FileAccess.Read);    ////fs.Seek(0, SeekOrigin.Begin); //定位流,从开始位置移动0个字节,也就是流的最开始位置    //int len = (int)fs.Length; //获取文件的字节长度     //byte[] arrByte = new byte[len]; //定义字节数组    //fs.Read(arrByte, 0, arrByte.Length); //将文件流读入字节数组    //this.txtContent.Text = Encoding.Default.GetString(arrByte,0,len);    //fs.Close();    //方案二:使用Filestream,逐字节读取文本,后将字节转换为string    //FileStream fs = new FileStream(this.txtFilePath.Text, FileMode.Open, FileAccess.Read);    //int len = (int)fs.Length; //获取文件的字节长度     //byte[] arrByte = new byte[len]; //定义字节数组    //int index = 0; //保存字节数组变化的下标    //int code = fs.ReadByte(); //读取一个字节    //while (code != -1) //读取内容等于-1即表示读取完毕    //{    //    //将读取内容转换成字节存入数组    //    arrByte[index] = Convert.ToByte(code);     //    code = fs.ReadByte();  //继续逐字节读取    //    index++;    //}    //this.txtContent.Text = Encoding.Default.GetString(arrByte, 0, len);    //fs.Close();//方案三:直接使用File的Read All Text 函数将文本文件内容全部读入text//File.ReadAllBytes可以读取成字节数组//this.txtContent.Text = File.ReadAllText(this.txtFilePath.Text, Encoding.Default);    //方案四:使用StreamReader流读取器读取    FileStream fs = new FileStream(this.txtFilePath.Text, FileMode.Open, FileAccess.Read);    StreamReader sd = new StreamReader(fs, Encoding.Default);    //这里可以逐行读入    //string line = sd.ReadLine();    //while (line != null)    //{    //    this.txtContent.Text = this.txtContent.Text + line + "\r\n";    //    line = sd.ReadLine();    //}    //也可以全部读入    this.txtContent.Text = sd.ReadToEnd();    sd.Close();    fs.Close();}private void btSave_Click(object sender, EventArgs e){    //方案一:File类静态方法    //File.WriteAllText(this.txtFileName.Text, this.txtContent.Text,Encoding.Default);    //MessageBox.Show("保存成功!");    //方案二:使用StreamWriter流写入器    FileStream fs = new FileStream(this.txtFileName.Text, FileMode.Open, FileAccess.Write);    StreamWriter sw = new StreamWriter(fs, Encoding.Default);    sw.Write(this.txtContent.Text);    sw.Close();    fs.Close();    MessageBox.Show("保存成功!");}

    四、序列化与反序列化

    序列化就是将对象实例的状态存储到存储媒介的过程。

    序列化和反序列化的实现步骤(二进制序列化):

    • (1)引入System.Runtime.Serialization.Formatters.Binary命名空间

    • (2)要序列化的对象需要标记Serializable特性

    • (3)其父类和属性中的引用类型也标记Serializable特性

    • (4)使用BinaryFormatter 对象的Serialize()方法和Deserialize()方法

    (1)序列化单个对象

    示例:如下图,实现单个对象的序列化与反序列化

    C#怎么开发Winform实现文件操作

    --输入学生信息,点击"保存信息"按钮,将学生信息永久序列化保存到电脑上。

    --关闭程序后,在启动程序,可以将本地序列化文件读取,将信息显示在界面的文本框中。

    其中,学号,姓名,年龄文本框的name分别为txtNo,txtName,txtAge。

    保存信息和读取信息按钮name分别为btSave和btRead。

    具体实现代码如下:

    定义一个学生类:

    [Serializable]class Student{    public string StuNo { get; set; } //学号    public string StuName { get; set; } //姓名    public int StuAge { get; set; } //年龄}

    其中[Serializable]关键字代表此类是可以被序列化的。

    编写按钮响应事件代码:

    private void btSave_Click(object sender, EventArgs e){    Student stu = new Student();    stu.StuNo = this.txtNo.Text;    stu.StuName = this.txtName.Text;    stu.StuAge = int.Parse(this.txtAge.Text);    FileStream fs = new FileStream("stu.ini", FileMode.Create, FileAccess.ReadWrite);    BinaryFormatter bf = new BinaryFormatter();    bf.Serialize(fs, stu);  //序列化    fs.Close();    MessageBox.Show("保存成功!");}private void btRead_Click(object sender, EventArgs e){    FileStream fs = new FileStream("stu.ini", FileMode.Open, FileAccess.ReadWrite);    BinaryFormatter bf = new BinaryFormatter();    Student stu = bf.Deserialize(fs) as Student;  //反序列化    this.txtNo.Text = stu.StuNo;    this.txtName.Text = stu.StuName;    this.txtAge.Text = stu.StuAge.ToString();    fs.Close();}

    (2)序列化集合

    示例:如下图,实现集合的序列化

    C#怎么开发Winform实现文件操作

    --打开窗体,自动从序列化文件中读取信息,并在listView列表上进行展示。

    --输入学生信息,点击"添加信息"按钮,添加学生,并且序列化学生列表,刷新ListView列表数据。

    其中展示列表的ListView控件的name=listView1。

    学号,姓名,年龄文本框的name分别为txtNo,txtName,txtAge。

    添加信息按钮name=btSave。

    具体实现代码如下:

    定义一个学生类:

    [Serializable]class Student{    public string StuNo { get; set; } //学号    public string StuName { get; set; } //姓名    public int StuAge { get; set; } //年龄}

    其中[Serializable]关键字代表此类是可以被序列化的。

    编写按钮响应事件代码:

    List<Student> list = new List<Student>();private void BindData(){    if (!File.Exists("list.ini"))        return;    //读取序列化文件    FileStream fs = new FileStream("list.ini", FileMode.Open, FileAccess.ReadWrite);    BinaryFormatter bf = new BinaryFormatter();    list = bf.Deserialize(fs) as List<Student>;  //反序列化    fs.Close();    //将list集合数据绑定到ListView控件    this.listView1.Items.Clear();    foreach (Student stu in list)    {        ListViewItem item = new ListViewItem(stu.StuNo);        item.SubItems.Add(stu.StuName);        item.SubItems.Add(stu.StuAge.ToString());        this.listView1.Items.Add(item);    }}private void Form2_Load(object sender, EventArgs e){    BindData();}private void btSave_Click(object sender, EventArgs e){    Student stu = new Student();    stu.StuNo = this.txtNo.Text;    stu.StuName = this.txtName.Text;    stu.StuAge = int.Parse(this.txtAge.Text);    list.Add(stu);    FileStream fs = new FileStream("list.ini", FileMode.Create, FileAccess.ReadWrite);    BinaryFormatter bf = new BinaryFormatter();    bf.Serialize(fs, list);  //序列化    fs.Close();    MessageBox.Show("保存成功!");    BindData();}

    关于“C#怎么开发Winform实现文件操作”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“C#怎么开发Winform实现文件操作”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

    免责声明:

    ① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

    ② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

    C#怎么开发Winform实现文件操作

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档

    猜你喜欢

    C#怎么开发Winform实现文件操作

    这篇文章主要介绍了C#怎么开发Winform实现文件操作的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么开发Winform实现文件操作文章都会有所收获,下面我们一起来看看吧。一、文件对话框C#中共有三种文
    2023-06-30

    C# winform跨线程操作控件怎么实现

    今天小编给大家分享一下C# winform跨线程操作控件怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前提:当我们使
    2023-07-02

    C语言怎么实现文件操作

    这篇文章将为大家详细讲解有关C语言怎么实现文件操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是文件磁盘上的文件就是文件。在程序设计中,我们一般谈的文件有两种:程序文件和数据文件程序文件包括源程序文
    2023-06-25

    C++中怎么实现文件流操作

    本篇文章给大家分享的是有关C++中怎么实现文件流操作,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C++文件流操作之文件写入:#include < fstream> #incl
    2023-06-17

    C#怎么实现文件Move和Copy操作

    这篇文章主要介绍“C#怎么实现文件Move和Copy操作”,在日常操作中,相信很多人在C#怎么实现文件Move和Copy操作问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么实现文件Move和Copy操作
    2023-06-29

    C#中怎么实现文件处理操作

    C#中怎么实现文件处理操作,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、什么是流?流是用来载体与载体之间传送数据的。载体是数据的载体,如:如果数据存放在硬盘
    2023-06-17

    C#怎么开发Winform实现学生管理系统

    这篇文章主要介绍“C#怎么开发Winform实现学生管理系统”,在日常操作中,相信很多人在C#怎么开发Winform实现学生管理系统问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么开发Winform实现
    2023-06-30

    Android 开发中如何实现操作文件

    今天就跟大家聊聊有关Android 开发中如何实现操作文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 Android 文件操作详解Android 的文件操作说白了就是Java的文
    2023-05-31

    Attribute在C# WinForm控件开发中怎么用

    这篇文章主要为大家展示了“Attribute在C# WinForm控件开发中怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Attribute在C# WinForm控件开发中怎么用”这篇文章
    2023-06-17

    C语言怎么实现对文件进行操作

    这篇“C语言怎么实现对文件进行操作”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言怎么实现对文件进行操作”文章吧。文件指
    2023-07-05

    C#实现XML文件操作详解

    这篇文章主要为大家详细介绍了如何利用C#实现XML操作文件,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-23

    VB.NET中怎么实现文件操作

    VB.NET中怎么实现文件操作,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、VB.NET文件操作之判断光驱的盘符:FunctionGetCDROM()\返回光驱的盘符(字母
    2023-06-17

    C#操作文本文件的实现方式

    本篇内容主要讲解“C#操作文本文件的实现方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#操作文本文件的实现方式”吧!C#操作文本文件是如何实现的呢?让我们开始讲述吧:using Syste
    2023-06-17

    C#中怎么操作文本文件

    这篇文章给大家介绍C#中怎么操作文本文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#操作文本文件演练实例浅析/* * 本讲解用C#如何处理文本文件,内容重点是如何建立一个文件读取文本文件内容 * * 如何
    2023-06-17

    C#中怎么操作INI文件

    今天就跟大家聊聊有关C#中怎么操作INI文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#对INI文件操作对INI文件进行写操作,是通过组件button2的"Click"事件来实
    2023-06-17

    C#实现利用Linq操作Xml文件

    这篇文章主要为大家详细介绍了C#如何利用Linq实现操作Xml文件,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-29

    PHP中怎么实现目录操作和文件操作

    今天就跟大家聊聊有关PHP中怎么实现目录操作和文件操作,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、目录操作首先介绍的是一个从目录读取的函数,opendir(),readdir(
    2023-06-17

    编程热搜

    • Python 学习之路 - Python
      一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
      Python 学习之路 - Python
    • chatgpt的中文全称是什么
      chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
      chatgpt的中文全称是什么
    • C/C++中extern函数使用详解
    • C/C++可变参数的使用
      可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
      C/C++可变参数的使用
    • css样式文件该放在哪里
    • php中数组下标必须是连续的吗
    • Python 3 教程
      Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
      Python 3 教程
    • Python pip包管理
      一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
      Python pip包管理
    • ubuntu如何重新编译内核
    • 改善Java代码之慎用java动态编译

    目录