CodeGym /课程 /C# SELF /检查文件/文件夹有没有

检查文件/文件夹有没有

C# SELF
第 38 级, 课程 2
可用

1. 介绍

为啥要检查文件或文件夹是否存在?

想象一下你在写日记,应用里有个把记录追加到文件末尾的功能。只要文件存在一切正常。但要是文件被意外删了,程序会崩,所有你那些关于人生意义或者天气的神来之笔就会无声无息地消失。同理,如果你要新建文件以防丢失,那就得先确认这个文件还不存在。

在真实项目里——尤其是企业级或工业级开发——事先检查文件和文件夹能避免用户操作导致的错误和严重故障,还能给团队省下大量时间和精力,而且最重要的,能少受很多头疼。

在 .NET 里操作文件系统

在 .NET 平台上,下面这些主要类很有用(它们都在命名空间 System.IO):

  • File — 用于文件操作的静态方法:检查、复制、删除等。
  • Directory — 用于目录操作的静态方法。

要检查是否存在,通常用这两个方法就够了:

  • File.Exists(path) — 如果文件存在,返回 true。
  • Directory.Exists(path) — 如果目录存在,返回 true。

2. 在打开前检查文件是否存在

生活中的示例

比如你加了个显示日记内容的功能:

string diaryPath = "diary.txt";
        
if (File.Exists(diaryPath))
{
    // 文件存在,读取并输出内容
    using var reader = new StreamReader(diaryPath);
    string content = reader.ReadToEnd();
    Console.WriteLine("你的日记:\n" + content);
}
else
{
    Console.WriteLine("没找到日记文件!");
    // 如果需要,可以立即创建一个新文件
    File.WriteAllText(diaryPath, "这是你日记的开头。\n");
    Console.WriteLine("创建了新的日记文件。");
}

在真实项目里这种做法是必备的:你不指望“运气好”,自己掌控流程。

3. 在写入前检查文件是否存在

场景:应用按计划生成报告。需要确保每个新报告不会覆盖之前的。

为此有必要先检查:文件是不是已经存在?如果是,可以让用户输入另一个名字,或者创建一个唯一命名的文件。

string reportPath = "report.txt";
        
if (File.Exists(reportPath))
{
    Console.WriteLine($"文件 '{reportPath}' 已经存在。请重命名或删除旧文件。");
}
else
{
    using var writer = new StreamWriter(reportPath);
    writer.WriteLine("这是今天的新报告!");
    Console.WriteLine("报告文件已成功创建。");
}

这样的检查可以避免用户(包括你自己)遇到被覆盖文件的不愉快惊喜。

4. 在写入前检查文件夹是否存在

文件很少直接放在项目根目录下。通常会放到专门的目录里:logs/、reports/、data/ 等。在写入文件前要确保目标文件夹存在。

string logsDir = "logs";
string logPath = Path.Combine(logsDir, "log.txt"); // Path.Combine 帮助安全地拼接路径部分
        
if (!Directory.Exists(logsDir))
{
    Console.WriteLine("没找到 'logs' 文件夹。正在创建...");
    Directory.CreateDirectory(logsDir);
}

using var writer = new StreamWriter(logPath, append: true);
writer.WriteLine($"[{DateTime.Now}] 应用已启动。");
Console.WriteLine("日志写入成功。");

顺便说一句,方法 Directory.CreateDirectory 如果目录已经存在不会抛错——它会直接忽略,所以如果你接受这种风格就可以不先检查。

5. 重要的注意点

细节:相对路径和绝对路径

新手常犯的错误是把相对路径和绝对路径搞混。比如你写 File.Exists("data.txt"),程序会在当前工作目录里找这个文件。那在哪儿?取决于你从哪儿启动应用。

为稳妥起见,使用绝对路径,或者通过 Path.Combine 构造路径:

string myDocs = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
string filePath = Path.Combine(myDocs, "myapp", "settings.txt");

路径写得明确,你就不会把文件丢在看不见的地方。

检查时的关键细节

  • 有时你会先检查,然后马上对同一个文件/目录做操作。在 File.Exists 之后到创建/删除之间可能有时间差,别的进程可能会改状态。在关键场景下要加上通过 try-catch 的异常处理。
  • 不仅要检查存在与否,还要检查访问权限。有时文件存在,但当前用户没有权限访问它。
  • 对目录使用 Directory.Exists,不要用 File.Exists ——否则会一直得到 false。
  • 如果路径包含多级嵌套目录,比如 "data/2024/04",那么 Directory.CreateDirectory("data/2024/04") 会创建整条目录链——这很方便,也省去很多检查。

如果不检查,会发生什么?

如果你试图打开一个不存在的文件来读,会抛出 FileNotFoundException。如果你试图在不存在的文件夹里创建文件,会抛出 DirectoryNotFoundException。如果程序在用户机器上跑,用户会看到报错,很不爽;在生产环境可能会丢数据/钱/时间。所以“检查是否存在”不是唠叨,而是对用户负责(也是为了自己的脑子省事)。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION