C#文件操作相关(1)

今日份主要内容:文件操作相关

  1. 文件相关类:File类,FileInnfo类

  2. 路径类:Path类

  3. 盘符类:DriverInfo类

  4. 目录类:Directory类,DirectoryInfo类

  5. 文件的输入与输出类:FileStream类,MemoryStream类,StreamReader类,StreamWriter类,StringReader类,StringWriter类

常用文件类概述

文件、目录(文件夹)、路径输入及输出常用的类有: File,FileInfo,Directory,DirectoryInfo,Path,DriveInfo。
可查看官方文档:F1或fn+F1

Path类提供对文件路径的相关操作。

DriveInfo类提供对有关驱动器(盘符)的信息的访问。

文件输入或输出流相关类:
FileStream类,MemoryStream类,StreamReader类,StreamWriter类,StringReader类,StringWriter类

本篇文章主要介绍1,2。

File类,FileInnfo类

在 C# 中,File类FileInfo类都用于处理文件操作。

File类提供了一系列的静态方法,用于对文件进行操作,例如创建、删除、移动、复制文件等。这些方法使用起来比较方便直接,但每次调用都会进行一些安全检查和权限验证等操作,可能会有一定的性能开销

FileInfo类则是表示文件的一个实例对象。通过创建FileInfo 对象,可以对特定的文件进行更细致和灵活的操作。它具有一些属性和方法来获取文件的详细信息,并执行一些文件操作。

File类和FileInfo类都是提供用于创建、复制、删除、移动和打开单一文件的方法,并协助创建 FileStream 对象。
File类是静态类。FileInfo类是密封类。FileInfo类和File类的API相似度高,使用比File类灵活。

例如:


using System.IO;

// 使用 File 类创建新文件
File.Create("example.txt");

// 使用 FileInfo 类操作文件
FileInfo fileInfo = new FileInfo("example.txt");
if (!fileInfo.Exists)
{
    fileInfo.Create();
}

文件输入和输出类规律:以Info以尾可以实例化,不带Info的是静态类,如:File是静态类,FileInfo可以实例化。

创建文件


// 1.创建文件
private void button1_Click(object sender, EventArgs e)
{
    // 路径
    string path = @"C: \Users\Administrator\Desktop\C#\输入输出\1.文件操作\"; //这里填写要创建文件的路径,不包括文件名。
    // 文件名
    string fileName = "b.txt";
    // 文件的完整路径
    string fullPath = Path.Combine(path, fileName);

    // 文件流,流要打开,记得关闭。建议使用using子句。流====》计算机中二进制流
    //FileStream fs = File.Create(fullPath, 100, FileOptions.None, new System.Security.AccessControl.FileSecurity()); FileOption枚举值;这是要传一个类,要new一下。

    /*FileStream fs = File.Create(fullPath); //这里Create()返回了一个FileStream 类型的文件。可以设置一个值去接收下这个文件。不想管什么类型的时候,FileStream可以写成var。

    // 创建编码,为了得了字节,向流只能写入字节
    Encoding encoding = Encoding.UTF8;
    Encoding encoding1 = Encoding.GetEncoding("UTF-8");
    byte[] bytes = encoding1.GetBytes("hello file55555");
    fs.Write(bytes, 0, bytes.Length);
    通过编码,让字节数组byte[]转换成字符串。
    // 关闭流,防止忘记
    fs.Close();*/

    // using子句,自动帮开发者关闭流。这个CreatText()返回了一个StreamWrite 的文件类型。
    using (StreamWriter sw = File.CreateText(fullPath))
    {
        // StreamWriter功能比FileStream单一些,但使用方便,可以直接写入字符串,而FileStream要求写入byte[]
        sw.Write("hello");
        sw.Write(" world");
        sw.WriteLine("中文");
    };
}

路径前面加一邮箱符号,可以不用写双斜杠。

  • 怎么找路径?

  • 右键单击项目名字,选择在文件资源管理器中打开文件夹。

  • 文件流打开之后不要忘记关闭,不关闭就一直占用内存。

  • fs.Write(); fs.Close();

重命名文件


// 2.重命名文件
private void button2_Click(object sender, EventArgs e)
{
    // 源文件,即重命名前的文件
    string fileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\b.txt";
    // 目标文件,即重命名后的文件
    string newFileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\bb.txt";

    // 目标文件存在时,先删除
    if (File.Exists(newFileName))
    {
        // 确保重命名后的文件不存在。
        File.Delete(newFileName);
    }
    // 再通过移动实现重命名
    File.Move(fileName, newFileName);
}

复制文件

 
 // 3.复制文件
 private void button3_Click(object sender, EventArgs e)
 {
     // 源文件,即复制前的文件
     string sourceFileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a.txt";
     // 目标文件,即复制后的文件
     string newFileName = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a1.txt";

     // Exists()判断文件是否存在,复制文件时,不允许覆盖同名文件,即源文件存在,目标文件不存在。
     if (File.Exists(sourceFileName) && !File.Exists(newFileName))
     {
         // 复制文件时,不允许覆盖同名文件
         File.Copy(sourceFileName, newFileName);
     }
 }

创建并写入文件


// 5.创建并写入文件
private void button5_Click(object sender, EventArgs e)
{
    string filename = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a2.txt";
    File.WriteAllText(filename, "你好!abc123"); // 创建文件,并写入内容
    File.AppendAllText(filename, "hello world"); // 追加内容,追加和写入不太一样,写入会替换原来的内容。
    // AppendText()也会追加内容,需要引用流来使用。
    using (var sw = File.AppendText(filename))
    {
        sw.WriteLine("HELLO WORLD1");
        sw.WriteLine("HELLO WORLD2");
    };
}

打开文件,读取文件


private void button6_Click(object sender, EventArgs e)
{
    // 打开的文件路径
    string filename = @"C:\Users\Administrator\Desktop\C#\输入输出\1.文件操作\a2.txt";
    // 打开方式:Open只打开,文件权限:Read,Write,ReadWrite
    using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.ReadWrite))
    {
        // 知道读取的字节数  1024不准确。fs.Length流中字节数
        byte[] bytes = new byte[fs.Length];
        // 把流中的内容读取byte[]中。Read()在读取大量内容,会阻塞。大量内容读取,建议使用ReadAsync()
        int count = fs.Read(bytes, 0, bytes.Length);
        // 把byte[]转换成字符串,才真正拿到内容。
        string result = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
        richTextBox1.Text = result;
    };
}

  • 写异步的时候,建议使用Async结尾的方法,好处不阻塞。

  • 也可以用begin,end,但这种方法比较古老,不建议使用。

选择文件


private void button7_Click(object sender, EventArgs e)
{
    DialogResult dialogResult = openFileDialog1.ShowDialog();
    if (dialogResult == DialogResult.OK) // 选择文件
    {
        string fileName = openFileDialog1.FileName;
        Debug.WriteLine(fileName);
        // ReadAllText()读取所有的文本,返回字符串,也会阻塞。
        //string content = File.ReadAllText(fileName);
        //richTextBox1.Text = content;

        // File静态文件类,FileInfo实例文件类
        FileInfo file = new FileInfo(fileName);
        Debug.WriteLine(file.FullName);
        Debug.WriteLine(file.Name);
        // 文件创建时间
        Debug.WriteLine(file.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"));
        // 文件修改时间
        Debug.WriteLine(file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"));
        // 文件最后一次访问时间
        Debug.WriteLine(file.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss"));

        // 文件的后缀名:.txt    媒体类型:https://www.runoob.com/http/mime-types.html
        //媒体类型MIME 文件后缀名 .txt 扩展名Extension
        Debug.WriteLine(file.Extension);
        Debug.WriteLine(Path.GetFileName(fileName));
        Debug.WriteLine(Path.GetFileNameWithoutExtension(fileName));
        Debug.WriteLine(Path.GetExtension(fileName));

        Debug.WriteLine(file.Attributes.ToString().Trim());
        // 拿文件类型
        if (file.Extension == ".txt")
        {
            Debug.WriteLine("文本文件");
        }

        // 文件大小
        Debug.WriteLine(Math.Ceiling(file.Length / 1024M).ToString("N0"));
    }
}

File类常用API

追加文本:AppendText(),AppendAllLines(),AppendAllText()
复制文件:Copy()
创建文件:Create(),CreateText()
删除文件:Delete()
移动文件:Move()
打开文件:Open(),OpenRead(),OpenText(),OpenWrite()
替换文件:Replace()
读取文件:ReadAllBytes(),ReadAllLines(),ReadAllText(),ReadLines()
写入文件:WriteAllBytes(),WriteAllLines(),WriteAllText()
判断文件是否存在:Exists()
加密及解密:Encrypt(),Decrypt()

读写文件:

  1. 需要流(最常用FileStram,也有可能是其他的流,如:StreamWriter等)
  2. 需要操作流的API(读写的API)
  3. 不要忘记关闭流。
posted @ 2024-08-17 10:31  海域  阅读(24)  评论(0编辑  收藏  举报