当前位置: 首页 > article >正文

C#/Winfrom -文件操作

一、文件对话框

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

(1)用于打开文件的对话框QpenFileDialog.

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

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

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

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

private void button1_Click(object sender, EventArgs e)

 {       //如果打开文件对话框 返回值ok

     if (this.openFileDialog1.ShowDialog()== DialogResult.OK)

     {  //保存文件路径到文本框

         this.txtPath.Text = this.openFileDialog1.FileName;

     }    

 }

OpenFileDialog常用属件表:

属性名

功能说明

InitialDirectory

对话框的初始目录

Filter

文件筛选器,按“显示名称|类型”格式编写 例如

文本文件|*.txt  | 所有文件|*.*

Filterlndex

在对话框中选择的文件筛选器的索引,如果选第一项就设为1

FileName

第一个在对话框中显示的文件或最后一个选取的文件

Title

将显示在对话框标题栏中的文字,描述对话框

CheckFileExists

在用户指定不存在的文件时是否显示警告

CheckPathExists

在对话框返回之前,检查指定路径是否存在

(2)SaveFileDialog对话框

保存文件对话框常用于软件中的“另存为”功能。

其常用属性、方法及使用方式与打开文件对话框相同,

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

(3)FolderBroswerDialog对话框

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

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

 private void button3_Click(object sender, EventArgs e)

 {

     if(this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)

     {// 返回被选中路径SelectedPath

         this.txtPath.Text = this.folderBrowserDialog1.SelectedPath;

     }

 }

FolderBroswerDialog常用属性:

属性名

说明

Description

显示在对话框的树视图上方的字符串,用来指定显示给用户的指导信息

RootFolder

设置根文件夹位置,打开文件夹的位置

SelectedPath

对话框中最先选择的文件夹或用户最后选择的文件夹完整路径

ShowNewFold

对话框中是否包括“新建文件夹“按钮

二、文件及文件夹操作

文件及文件夹管理是操作系统的重要组成部分,

主要包括创建、移动、复制和删除等操作。

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

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

只能再同一个盘符进行移动复制操作

文件常用操作

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

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

  1. 点击”选择文件"按钮选择某个文件,并将文件路径在文本框显示。
  2. 点击”选择文件夹"按钮选择某个文件夹,并将文件夹路径在文本框显示。
  3. 点击”复制文件"按钮,实现将文件复制到文件夹中, File.Copy();
  4. 点击"移动文件”按钮,实现将文件移动到文件夹中。File.Move();
  5. 点击”删除文件“按钮,实现将文件删除。File.Delete();
    //打开文件

    private void openFileBtn_Click(object sender, EventArgs e)

    {

        if (this.openFileDialog1.ShowDialog() == DialogResult.OK)

        {

            texFileName.Text = openFileDialog1.FileName;

        }

    }

    //打开文件夹

    private void openFolderBtn_Click(object sender, EventArgs e)

    {

        if (this.folderBrowserDialog1.ShowDialog() == DialogResult.OK)

        {

            texFolderName.Text = folderBrowserDialog1.SelectedPath;

        }

    }

    //复制文件

    private void copyBtn_Click(object sender, EventArgs e)

    {

        //判断源文件是否存在
        if (!File.Exists(texFileName.Text))

        {

            MessageBox.Show("文件不存在");

            return;

        }//判断目标文件夹是否存在
        if (!Directory.Exists(texFolderName.Text))

        {

            MessageBox.Show("文件不存在");

            return;

        }

        string sourceFile = texFileName.Text;//源文件

        //处理目标文件

        string[] arrFile = sourceFile.Split("\\");

        string destFileName = texFolderName.Text + "\\" + arrFile[arrFile.Length - 1];

        File.Copy(sourceFile, destFileName, true);

        MessageBox.Show("文件复制成功");

    }

    //移动文件

    private void moveBtn_Click(object sender, EventArgs e)

    {

        //判断源文件是否存在

        if (!File.Exists(texFileName.Text))

        {

            MessageBox.Show("文件不存在");

            return;

        }//判断目标文件夹是否存在

        if (!Directory.Exists(texFolderName.Text))

        {

            MessageBox.Show("文件不存在");

            return;

        }

        string sourceFile = texFileName.Text;//源文件

        //处理目标文件

        string[] arrFile = sourceFile.Split("\\");

        string destFileName = texFolderName.Text + "\\" + arrFile[arrFile.Length - 1];

        //如果目标文件夹有重名文件 直接删除再复制

        if (File.Exists(destFileName))

        {

            File.Delete(destFileName);

        }

        File.Move(sourceFile, destFileName);

        MessageBox.Show("文件移动成功");

    }

    //删除文件

    private void deleteBtn_Click(object sender, EventArgs e)

    {

        //判断源文件是否存在

        if (!File.Exists(texFileName.Text))

        {

            MessageBox.Show("文件不存在");

            return;

        }

        string sourceFile = texFileName.Text;//源文件

        File.Delete(sourceFile);

        MessageBox.Show("文件已删除");

    }



}

使用FileInfo类(实例类)实现同上功能

    //复制文件
    private void copyBtn_Click(object sender, EventArgs e)

    {      

        FileInfo fileInfo = new FileInfo(texFileName.Text);

        if (!fileInfo.Exists)

        {

            MessageBox.Show("文件不存在");

            return;

        }

        DirectoryInfo directoryInfo = new DirectoryInfo(texFolderName.Text);

        if (!directoryInfo.Exists)

        {

            MessageBox.Show("文件夹不存在");

            return;

        }

        string[] array = texFileName.Text.Split("\\");

        string newName = array[array.Length - 1];

        fileInfo.CopyTo(texFolderName.Text + "//" + newName);

        MessageBox.Show("文件复制成功");

    }

    //移动文件
    private void moveBtn_Click(object sender, EventArgs e)

    {

        FileInfo fileInfo = new FileInfo(texFileName.Text);

        if (!fileInfo.Exists)

        {

            MessageBox.Show("文件不存在");

            return;

        }

        DirectoryInfo directoryInfo = new DirectoryInfo(texFolderName.Text);

        if (!directoryInfo.Exists)

        {

            MessageBox.Show("文件夹不存在");

            return;

        }

        string[] array = texFileName.Text.Split("\\");

        string newName = array[array.Length - 1];

        fileInfo.MoveTo(texFolderName.Text + "//" + newName);

        MessageBox.Show("文件移动成功");

    }

        //删除文件
        private void deleteBtn_Click(object sender, EventArgs e)

    {
        FileInfo fileInfo = new FileInfo(texFileName.Text);

        if (!fileInfo.Exists)

        {
            MessageBox.Show("文件不存在");

            return;

        }

        fileInfo.Delete();

        MessageBox.Show("文件删除成功");

    }

}

文件夹常用操作 无copy

Directory类是静态类,其中所有方法都是静态的,通过类名直接调用。示例,如下图,进行文件夹的基本操作:

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

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

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

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

Directory实现代码如下:

    private void btnMove_Click(object sender, EventArgs e)

    {

        if (!Directory.Exists(textFolder1.Text) || !Directory.Exists(textFolder2.Text))

        {

            MessageBox.Show("文件夹不存在");

        }

        //处理目标文件路径
        string[] arrayFolder = textFolder1.Text.Split("\\");

        string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];

        Directory.Move(textFolder1.Text,distFolder);

        MessageBox.Show("移动成功");



    }



    private void btnDelete_Click(object sender, EventArgs e)

    {

        if (!Directory.Exists(textFolder1.Text)){

            MessageBox.Show("文件夹不存在");

            return;

        }

        Directory.Delete(textFolder1.Text);

        MessageBox.Show("删除成功");

    }

}

使用DirectoryInfo类(实例类)实现同上功能

  1. directory1.Exists     属性
  2.  directory1.MoveTo(distFolder);    方法
  3.  directory1.Delete(true);方法
    private void btnMove_Click(object sender, EventArgs e)

    {

        DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);

        DirectoryInfo directory2 = new DirectoryInfo(textFolder2.Text);

        if (!directory1.Exists || !directory2.Exists)

        {

            MessageBox.Show("文件夹不存在");

        }

        //处理目标文件路径
        string[] arrayFolder = textFolder1.Text.Split("\\");

        string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];

        directory1.MoveTo(distFolder);

        MessageBox.Show("移动成功");



    }



    private void btnDelete_Click(object sender, EventArgs e)

    {

        DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);

        if (!directory1.Exists)

        {

            MessageBox.Show("文件夹不存在");

            return;

        }

       directory1.Delete(true);

        MessageBox.Show("删除成功");

    }

}

跨盘符文件夹的复制和移动(剪切)

  1. 关于文件夹的移动,系统提供给我们的功能,只能在同一个根盘符上操作。
  2. 关于文件夹的复制,系统根本就没有提供相应的API。

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

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

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

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

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

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

具体实现代码如下:  

//文件夹的跨盘符移动  递归调用

    public void copyFolder(string startPath , string endPath)

    {

        DirectoryInfo  directoryInfo = new DirectoryInfo(startPath);

        Directory.CreateDirectory(endPath);

        //遍历源文件夹下的所有文件

        foreach (FileInfo file in directoryInfo.GetFiles())

            //获得文件名,组装成完整路径

        {

            file.CopyTo(endPath + "\\" + file.Name);

        }//遍历源文件下的文件夹 在目标文件夹下创建新的文件夹

        foreach (DirectoryInfo directory in directoryInfo.GetDirectories())

        { 

            string strPath =  directory.FullName;

            string ePath = endPath + "\\" + directory.Name;

            copyFolder(strPath, ePath);

        }    

    }

     private void btnCopy_Click(object sender, EventArgs e)

    {

        DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);

        DirectoryInfo directory2 = new DirectoryInfo(textFolder2.Text);

        if (directory1.Exists == false ||directory2.Exists == false)

        {

            MessageBox.Show("文件夹不存在");

        }

        //处理目标文件路径

        string[] arrayFolder = textFolder1.Text.Split("\\");

        string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];

        copyFolder(directory1.FullName, distFolder);

        MessageBox.Show("复制成功");



    }



    private void btnMove_Click(object sender, EventArgs e)

    {

        DirectoryInfo directory1 = new DirectoryInfo(textFolder1.Text);

        DirectoryInfo directory2 = new DirectoryInfo(textFolder2.Text);

        if (directory1.Exists == false || directory2.Exists == false)

        {

            MessageBox.Show("文件夹不存在");

        }

        //处理目标文件路径

        string[] arrayFolder = textFolder1.Text.Split("\\");

        string distFolder = textFolder2.Text + "\\" + arrayFolder[arrayFolder.Length - 1];

        copyFolder(directory1.FullName, distFolder);

        directory1.Delete(true);

        MessageBox.Show("剪切成功");



    }

   

读写文本文件

文件和流的概念:

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

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

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

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

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

Filestream(文件流 )   seek() 移动文件指针

StreamReader(流读取器)

StreamWriter(流写入器)

读写文件操作的基本步骤为:

1.创建文件流

2.创建读、写器

3. 执行读、写操作

4. 关闭读写器

5.关闭文件流

文件流对象:

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

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对象和基础流

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

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

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

  1. fs.Read(bytes,0, len)  一次性读完
  2. fs.ReadByte(); // 一个字节一个字节读 
    1. 读取部分内容 判断文件类型
  3. File.ReadAllText()  静态类
  4. StreamReade的实例对象读取
 private void btnOpen_Click(object sender, EventArgs e)

{

    if(this.openFileDialog1.ShowDialog() == DialogResult.OK)

    {   //将文件路径保存到文本框中

        this.textPath.Text = this.openFileDialog1.FileName;

    }else

        return;

    //显示文本内容
    //方案一:FileStream将文件一次性读到byte[]中,然后再转换成字符串

    FileStream fs = new FileStream(textPath.Text,FileMode.Open,FileAccess.Read);

     int len = (int)fs.Length; //获取文件流中的字节长度

     byte[] bytes = new byte[len];//定义字节数组保存文本内容

     fs.Read(bytes,0, len); //文件流读入字节数组中

     //字节数组转换成字符串存入文本框中

     this.textContent.Text = Encoding.UTF8.GetString(bytes);

     fs.Close();

    //***************************************************************************************

    //方案二:FileStream将文件一次性读到byte[]中,然后再转换成字符串

    FileStream fs = new FileStream(textPath.Text, FileMode.Open, FileAccess.Read);

    int len = (int)fs.Length; //获取文件流中的字节长度

    byte[] bytes = new byte[len];//定义字节数组保存文本内容

    int index = 0; //初始化索引

    int code = fs.ReadByte(); //读取第一个字节 code = -1 表示读完

    while (code != -1)

    {             

        bytes[index] =Convert.ToByte(code); //读取内容存入字节数组中

        code = fs.ReadByte(); //继续读字节

        index++;



    }//字节数组转换成字符串存入文本框中

    this.textContent.Text = Encoding.UTF8.GetString(bytes);

    fs.Close();

    //***************************************************************************************         

    //方案三:使用FIle静态类   适合读取小文件

     this.textContent.Text = File.ReadAllText(textPath.Text);



    //***************************************************************************************

    //方案四:使用StreamReader读取文件内容,可以异步读取

    FileStream fs = new FileStream(textPath.Text, FileMode.Open,FileAccess.Read);

    //创建StreamReader实例

    StreamReader sr = new StreamReader(fs);

    this.textContent.Text = sr.ReadToEnd();

    sr.Close();

    fs.Close();

}

写入文件后保存

 File.WriteAllTex()  静态类
StreamWriter 类的实例方法
            //使用静态类写入文件

            File.WriteAllText(textPath.Text, textContent.Text, Encoding.Default);

            MessageBox.Show("文件保存成功");

   //***************************************************************************************

            //使用StreamWriter 写入文本内容   FileAccess.Write

            FileStream fs = new FileStream(textPath.Text, FileMode.Open, FileAccess.Write);

            StreamWriter sw = new StreamWriter(fs, Encoding.Default);

            sw.Write(textContent.Text);

            sw.Close();

            fs.Close();

            MessageBox.Show("文件保存成功");

 


http://www.kler.cn/a/441409.html

相关文章:

  • 高速光模块中的并行光学和WDM波分光学技术
  • 苍穹外卖-day10
  • (2)STM32 USB设备开发-USB虚拟串口
  • 落地 ORB角点检测与sift检测
  • 【玩转全栈】----Django连接MySQL
  • 如何进行市场调研?海外问卷调查有哪些类型和示例?
  • Unity中展示当前时间
  • 使用 rvest 包快速抓取网页数据:从入门到精通
  • .NET6 WebAPI从基础到进阶--朝夕教育
  • Kubernetes Service 详解:如何轻松管理集群中的服务
  • 什么是MyBatis?
  • 【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念
  • [数据结构]无向图的深度优先非递归遍历
  • Python中cv2 (OpenCV, opencv-python)库的安装、使用方法demo最新详细教程
  • TGA历年最佳年度游戏
  • 靜態IP與DHCP的區別和用法
  • 基于springboot+vue实现的北部湾地区助农平台 (源码+L文+ppt)4-119
  • 网络隧道与代理
  • 医学统计软件的选择:SPSS与R语言的深度对比
  • 高并发-缓存预热
  • JavaScript期末复习日记1——基本语法操作01
  • Java开源位图(Bitmap)工具库和框架
  • vscode的copilot提示e.replace is not a function
  • Amazon Bedrock与AWS服务的无缝集成,如何打造智能化应用
  • 约瑟夫环四种解法(数组,链表,递归,数学归纳)C/C++
  • 【学习笔记】桌面浏览器的视口