深入理解C#中的文件系统I/O操作

news2024/10/6 2:02:24

        文件系统I/O操作是任何编程语言中的重要组成部分,C#也不例外。无论是读写文件、操作目录,还是处理文件流,C#都提供了丰富且强大的类库来实现这些功能。本文将详细介绍C#中的文件系统I/O操作,并通过代码示例展示如何高效地处理文件和目录。

1. 读写文件
写入文件

在C#中,可以使用System.IO命名空间下的File类来进行文件写入操作。

示例:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.txt";
        string content = "这是一个示例文本。";

        // 写入文件
        File.WriteAllText(path, content);
        Console.WriteLine("文件写入成功。");
    }
}
读取文件

同样,我们也可以使用File类来读取文件内容:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example.txt";

        if (File.Exists(path))
        {
            // 读取文件内容
            string content = File.ReadAllText(path);
            Console.WriteLine("文件内容:");
            Console.WriteLine(content);
        }
        else
        {
            Console.WriteLine("文件不存在。");
        }
    }
}
2. 使用文件流

文件流提供了一种更灵活的文件读写方式,特别是在处理大文件时,文件流能够逐字节地读写数据,从而避免内存占用过高。

使用FileStream写入文件
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "filestream_example.txt";
        byte[] data = System.Text.Encoding.UTF8.GetBytes("通过FileStream写入的数据。");

        using (FileStream fs = new FileStream(path, FileMode.Create))
        {
            fs.Write(data, 0, data.Length);
            Console.WriteLine("数据已通过FileStream写入。");
        }
    }
}
使用FileStream读取文件
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "filestream_example.txt";

        using (FileStream fs = new FileStream(path, FileMode.Open))
        {
            byte[] data = new byte[fs.Length];
            fs.Read(data, 0, data.Length);
            string content = System.Text.Encoding.UTF8.GetString(data);
            Console.WriteLine("通过FileStream读取的内容:");
            Console.WriteLine(content);
        }
    }
}
3. 操作目录
创建目录

在C#中,可以使用Directory类来创建目录:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string dirPath = "example_directory";

        if (!Directory.Exists(dirPath))
        {
            Directory.CreateDirectory(dirPath);
            Console.WriteLine("目录创建成功。");
        }
        else
        {
            Console.WriteLine("目录已存在。");
        }
    }
}
删除目录

可以使用Directory类来删除目录:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string dirPath = "example_directory";

        if (Directory.Exists(dirPath))
        {
            Directory.Delete(dirPath, true);
            Console.WriteLine("目录已删除。");
        }
        else
        {
            Console.WriteLine("目录不存在。");
        }
    }
}
4. 遍历文件和目录
获取目录中的文件列表

可以使用Directory类获取指定目录中的文件列表:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string dirPath = "example_directory";

        if (Directory.Exists(dirPath))
        {
            string[] files = Directory.GetFiles(dirPath);
            Console.WriteLine("目录中的文件:");
            foreach (string file in files)
            {
                Console.WriteLine(file);
            }
        }
        else
        {
            Console.WriteLine("目录不存在。");
        }
    }
}
递归遍历目录

可以使用递归算法遍历目录及其子目录中的所有文件:

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string dirPath = "example_directory";

        if (Directory.Exists(dirPath))
        {
            TraverseDirectory(dirPath);
        }
        else
        {
            Console.WriteLine("目录不存在。");
        }
    }

    static void TraverseDirectory(string dirPath)
    {
        string[] files = Directory.GetFiles(dirPath);
        string[] directories = Directory.GetDirectories(dirPath);

        foreach (string file in files)
        {
            Console.WriteLine("文件: " + file);
        }

        foreach (string directory in directories)
        {
            Console.WriteLine("目录: " + directory);
            TraverseDirectory(directory); // 递归遍历子目录
        }
    }
}
5. 文件属性操作

在文件系统操作中,读取和设置文件属性是一个常见需求。C#提供了FileInfo类来实现这一功能。

读取文件属性
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        FileInfo fileInfo = new FileInfo(filePath);

        if (fileInfo.Exists)
        {
            Console.WriteLine("文件名: " + fileInfo.Name);
            Console.WriteLine("文件路径: " + fileInfo.FullName);
            Console.WriteLine("文件大小: " + fileInfo.Length);
            Console.WriteLine("创建时间: " + fileInfo.CreationTime);
            Console.WriteLine("最后访问时间: " + fileInfo.LastAccessTime);
            Console.WriteLine("最后修改时间: " + fileInfo.LastWriteTime);
        }
        else
        {
            Console.WriteLine("文件不存在。");
        }
    }
}
设置文件属性
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "example.txt";

        FileInfo fileInfo = new FileInfo(filePath);

        if (fileInfo.Exists)
        {
            // 设置文件属性
            fileInfo.Attributes = FileAttributes.ReadOnly;
            Console.WriteLine("文件属性已设置为只读。");

            // 恢复文件属性
            fileInfo.Attributes = FileAttributes.Normal;
            Console.WriteLine("文件属性已恢复为正常。");
        }
        else
        {
            Console.WriteLine("文件不存在。");
        }
    }
}
6. 异步文件I/O操作

在处理大文件或进行耗时的文件操作时,使用异步方法可以提高应用程序的响应性。C#提供了异步方法来进行文件的读写操作。

异步写入文件
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string path = "async_example.txt";
        string content = "这是一个异步写入示例。";

        await File.WriteAllTextAsync(path, content);
        Console.WriteLine("文件异步写入成功。");
    }
}
异步读取文件
using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string path = "async_example.txt";

        if (File.Exists(path))
        {
            string content = await File.ReadAllTextAsync(path);
            Console.WriteLine("文件内容:");
            Console.WriteLine(content);
        }
        else
        {
            Console.WriteLine("文件不存在。");
        }
    }
}
7. 文件监视

C#提供了FileSystemWatcher类,用于监视指定目录中的文件或目录的更改。这在需要对文件系统变化做出响应的应用程序中非常有用。

使用FileSystemWatcher监视文件变化
using System;
using System.IO;

class Program
{
    static void Main()
    {
        string path = "example_directory";

        if (!Directory.Exists(path))
        {
            Directory.CreateDirectory(path);
        }

        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = path;
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.Size;
        watcher.Filter = "*.*";

        watcher.Changed += OnChanged;
        watcher.Created += OnChanged;
        watcher.Deleted += OnChanged;
        watcher.Renamed += OnRenamed;

        watcher.EnableRaisingEvents = true;

        Console.WriteLine("正在监视目录: " + path);
        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }

    private static void OnChanged(object source, FileSystemEventArgs e)
    {
        Console.WriteLine($"文件: {e.FullPath} {e.ChangeType}");
    }

    private static void OnRenamed(object source, RenamedEventArgs e)
    {
        Console.WriteLine($"文件: {e.OldFullPath} 重命名为 {e.FullPath}");
    }
}

希望这些内容对你有所帮助,感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1903823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【国产AI绘图】快手把“可图”大模型开源了,这是一款支持中文的SDXL模型

Kolors 是由 Kuaishou Kolors 团队(快手可图)开发的基于潜在扩散的大规模文本到图像生成模型。经过数十亿对文本图像的训练,Kolors 在视觉质量、复杂语义的准确性以及中英文字符的文本渲染方面,与开源和专有模型相比都具有显著优势…

【LInux】从动态库的加载深入理解页表机制

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

YOLOv8改进---BiFPN特征融合

一、BiFPN原理 1.1 基本原理 BiFPN(Bidirectional Feature Pyramid Network),双向特征金字塔网络是一种高效的多尺度特征融合网络,其基本原理概括分为以下几点: 双向特征融合:BiFPN允许特征在自顶向下和自…

DAY21-力扣刷题

1.买卖股票的最佳时机 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09; class Solution {public int maxProfit(int[] prices) {int minpriceInteger.MAX_VALUE;int maxprofit0;for(int i0;i<prices.length;i){if(prices[i]<minprice){minpriceprices[…

【面试八股文】java基础知识

引言 本文是java面试时的一些常见知识点总结归纳和一些拓展&#xff0c;笔者在学习这些内容时&#xff0c;特地整理记录下来&#xff0c;以供大家学习共勉。 一、数据类型 1.1 为什么要设计封装类&#xff0c;Integer和int区别是什么&#xff1f; 使用封装类的目的 对象化:…

Webpack安装以及快速入门

3 Webpack 1 什么是Webpack https://webpack.js.org/ (官网) webpack 是一个现代 javascript 应用程序的 静态模块打包器 (module bundler) 待会要学的 vue-cli 脚手架环境, 集成了 webpack, 所以才能对各类文件进行打包处理 webpack是一个 静态模块 打包器,可以做以下的这…

数据自动备份方法分享!

现在很多朋友对于第三方软件颇为青睐&#xff0c;因为它们具备许多电脑自带备份工具所不具备的功能。例如&#xff0c;自动备份数据的需求。尽管你已经备份了电脑数据&#xff0c;但日常使用中数据常会增加&#xff0c;你可能无暇顾及每天的备份工作。因此&#xff0c;使用数据…

C++ 引用做函数返回值

作用&#xff1a;引用是可以作为函数的返回值存在的 注意&#xff1a;不要返回局部变量引用 用法&#xff1a;函数调用作为左值 示例&#xff1a; 运行结果&#xff1a;

cs231n作业1——KNN

参考文章&#xff1a;assignment1——KNN KNN 测试时分别计算测试样本和训练集中的每个样本的距离&#xff0c;然后选取距离最近的k个样本的标签信息来进行分类。 方法1&#xff1a;Two Loops for i in range(num_test):for j in range(num_train):dist X[i, :] - self.X…

昇思25天学习打卡营第19天 | RNN实现情感分类

RNN实现情感分类 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative 预测标签: Negative输入: This fil…

Vue3+.NET6前后端分离式管理后台实战(二十八)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(二十八)

初阶数据结构 二叉树常用函数(二)

函数一 求二叉树第K层的节点个数 还是一样 我们假设 K就是等于一 如果说是一个空数的话就返回0 如果说有值的话就返回一个1就可以 假设这个这层既不为空 又不是第K层的话 那么就说明第K层肯定是子树下面 那么就说明是左右子树的第&#xff08;K-1&#xff09;层 那么只将…

系统化学习 H264视频编码(02) I帧 P帧 B帧 引入及相关概念解读

说明&#xff1a;我们参考黄金圈学习法&#xff08;什么是黄金圈法则?->模型 黄金圈法则&#xff0c;本文使用&#xff1a;why-what&#xff09;来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法&#xff0c;理论方面会更多地讲清楚 音视频中概念的…

STM32-Unix时间戳和BKP备份寄存器以及RTC实时时钟

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. Unix时间戳1.1 Unix时间戳简介1.2 UTC/GMT1.3 时间戳转换 2. BKP备份寄存器2.1 BKP简介2.2 BKP基本结构2.3 BKP库函数 3. RTC实时时钟3.1 RTC简介3.2 RTC框图3.3 RTC基本结构3.4 硬件电路3.5 RTC操作注意事项3.6 R…

使用qt creator配置msvc环境(不需要安装shit一样的宇宙第一IDE vs的哈)

1. 背景 习惯使用Qt编程的童鞋&#xff0c;尤其是linux下开发Qt的童鞋一般都是使用qt creator作为首选IDE的&#xff0c;通常在windows上使用Qt用qt creator作为IDE的话一般编译器有mingw和msvc两种&#xff0c;使用mingw版本和在linux下的方式基本上一样十分简单&#xff0c;不…

在linux系统centos上面安装php7gmp扩展

ps:在ubuntu上面安装gmp(最简单) $ sudo apt-get install php7.0-gmp然后再php.ini添加extensionphp_gmp.so <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<…

论文略读: LLaMA Pro: Progressive LLaMA with Block Expansion

ACL 2024 人类通常在不损害旧技能的情况下获得新技能 然而&#xff0c;对于大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如从LLaMA到CodeLLaMA&#xff0c;情况正好相反。深度学习笔记&#xff1a;灾难性遗忘-CSDN博客——>论文提出了一种用于LLMs的新的预训练…

移动硬盘“需格式化”预警:专业数据恢复指南

移动硬盘“需格式化”危机&#xff1a;了解背后的真相 在日常的数字生活中&#xff0c;移动硬盘作为我们存储重要数据的“保险箱”&#xff0c;其稳定性与安全性直接关系到我们信息的完整与便捷访问。然而&#xff0c;当您尝试打开移动硬盘时&#xff0c;屏幕上赫然出现的“需…

Ubantu22.04 通过FlatPak安装微信

Ubuntu22.04 下使用Flatpak稳定安装微信&#xff01; 国际惯例&#xff0c;废话不多说&#xff0c;先上效果图。为啥使用Flatpak,因为Wechat官方只在FlatPak发布了最新的版本。之前使用了Wine以及Dock安装Wechat,效果都不是很理想&#xff0c;bug很多。所以使用了FlatPak。 Fl…

恢复出厂设置手机变成砖

上周&#xff0c;许多Google Pixel 6&#xff08;6、6a、6 Pro&#xff09;手机用户在恢复出厂设置后都面临着设备冻结的问题。 用户说他们在下载过程中遇到了丢失 tune2fs 文件的错误 。 这会导致屏幕显示以下消息&#xff1a;“Android 系统无法启动。您的数据可能会被损坏…