1. 介绍
为啥要检查文件或文件夹是否存在?
想象一下你在写日记,应用里有个把记录追加到文件末尾的功能。只要文件存在一切正常。但要是文件被意外删了,程序会崩,所有你那些关于人生意义或者天气的神来之笔就会无声无息地消失。同理,如果你要新建文件以防丢失,那就得先确认这个文件还不存在。
在真实项目里——尤其是企业级或工业级开发——事先检查文件和文件夹能避免用户操作导致的错误和严重故障,还能给团队省下大量时间和精力,而且最重要的,能少受很多头疼。
在 .NET 里操作文件系统
在 .NET 平台上,下面这些主要类很有用(它们都在命名空间 System.IO):
要检查是否存在,通常用这两个方法就够了:
- 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。如果程序在用户机器上跑,用户会看到报错,很不爽;在生产环境可能会丢数据/钱/时间。所以“检查是否存在”不是唠叨,而是对用户负责(也是为了自己的脑子省事)。
GO TO FULL VERSION