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

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

1. 读写文件
写入文件

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

示例:

cs 复制代码
using System;
using System.IO;

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

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

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

cs 复制代码
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写入文件
cs 复制代码
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读取文件
cs 复制代码
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类来创建目录:

cs 复制代码
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类来删除目录:

cs 复制代码
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类获取指定目录中的文件列表:

cs 复制代码
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("目录不存在。");
        }
    }
}
递归遍历目录

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

cs 复制代码
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类来实现这一功能。

读取文件属性
cs 复制代码
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("文件不存在。");
        }
    }
}
设置文件属性
cs 复制代码
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#提供了异步方法来进行文件的读写操作。

异步写入文件
cs 复制代码
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("文件异步写入成功。");
    }
}
异步读取文件
cs 复制代码
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监视文件变化
cs 复制代码
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}");
    }
}

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

相关推荐
Once_day3 小时前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
觉醒大王3 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
喜欢喝果茶.3 小时前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓3 小时前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)3 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
feasibility.3 小时前
AI 编程助手进阶指南:从 Claude Code 到 OpenCode 的工程化经验总结
人工智能·经验分享·设计模式·自动化·agi·skills·opencode
三水不滴3 小时前
计网:输入网址到网页显示
经验分享·笔记·计算机网络
向上的车轮3 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
island13143 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
坚持就完事了3 小时前
Java中的集合
java·开发语言