用 file.create 创建文件后必须显式关闭流,推荐 using 语句;写内容优先用 file.writealltext,它自动创建、写入并关闭;路径不存在时需先调用 directory.createdirectory;注意目录权限与只读属性。

用 File.Create 创建空文件,但记得关流
直接调用 File.Create("path.txt") 确实能新建文件,但它返回一个 FileStream 对象,且默认保持打开状态。如果后续代码立刻尝试写入或删除这个文件,大概率会抛出 IOException: The process cannot access the file...。
正确做法是显式关闭流,或者更推荐——用 using 语句自动释放:
using (var fs = File.Create("log.txt"))
{
// 可选:写点初始内容
}
不加 using 或 .Close(),文件句柄一直占着,尤其在循环中反复创建同名文件时,很容易卡住。
想一步到位写内容?用 File.WriteAllText 更安全
大多数时候你不是只想“建个空壳”,而是“建个带内容的文件”。这时别绕弯:File.WriteAllText 会自动创建文件(如果不存在)、覆盖写入、并妥善关闭流。
它比手动开流 + 写 + 关流少出错,也比 File.CreateText(返回 StreamWriter)更简洁:
File.WriteAllText("config.json", "{\n \"timeout\": 30\n}");
注意:WriteAllText 默认用 UTF-8 编码(不含 BOM),如果目标系统要求带 BOM 或 ANSI,得显式传入 Encoding 参数。
采用 php+mysql 数据库方式运行的强大网上商店系统,执行效率高速度快,支持多语言,模板和代码分离,轻松创建属于自己的个性化用户界面 v3.5更新: 1).进一步静态化了活动商品. 2).提供了一些重要UFT-8转换文件 3).修复了除了网银在线支付其它支付显示错误的问题. 4).修改了LOGO广告管理,增加LOGO链接后主页LOGO路径错误的问题 5).修改了公告无法发布的问题,可能是打压
路径不存在时会报错?先用 Directory.CreateDirectory
File.Create 和 WriteAllText 都不会自动创建父目录。比如写 "data/logs/app.log",而 data 或 logs 文件夹根本不存在,就会直接抛 DirectoryNotFoundException。
解决方法很简单,在写文件前确保路径就绪:
- 用
Path.GetDirectoryName("data/logs/app.log")提取目录部分 - 再用
Directory.CreateDirectory(dirPath)—— 这个方法很省心,路径已存在也不会报错
完整片段:
string path = "data/logs/latest.txt"; Directory.CreateDirectory(Path.GetDirectoryName(path)); File.WriteAllText(path, "started");
权限和只读属性容易被忽略
即使代码没报错,文件也可能建出来却无法写入。常见原因有两个:
- 目标目录所在磁盘/文件夹设置了只读属性(Windows 上右键属性可查)
- 程序没有写入该路径的权限(比如往
C:\Program Files写,UAC 会拦截)
开发阶段建议优先写到 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 或项目输出目录(AppDomain.CurrentDomain.BaseDirectory),避开权限雷区。上线前再根据部署环境调整路径逻辑。









