C#: 在已知DirectoryInfo的目录中创建一个新的FileInfo

21

我只是想知道当你有以下情况时:

var dir = new DirectoryInfo(@"C:\Temp");

有没有比这更简单/更清晰的方法将一个新文件添加到该目录中?

var file = new FileInfo(Path.Combine(dir.FullName, "file.ext"));

我想我可能只需要创建一个扩展方法之类的东西,但我很好奇是否已经存在我在这里看不到的东西...我的意思是,例如 DirectoryInfo 已经有了 GetFiles() 方法。


你提供的代码看起来对我来说没什么问题(由于我在这里并没有真正添加价值,所以标记为维基...)。 - Marc Gravell
1
是的,它缺少一个(DirectoryInfo, string)构造函数。 - Spongman
3个回答

21

你想要做什么?标题说的是“创建一个新文件”。FileInfo对象不是文件,它是一个持有关于文件信息(可能存在也可能不存在)的对象。如果你真的想要创建文件,有许多方法可以实现。其中最简单的一种方式如下:

File.WriteAllText(Path.Combine(dir.FullName, "file.ext"), "some text");

如果您想基于FileInfo对象创建文件,可以使用以下方法:

var dir = new DirectoryInfo(@"C:\Temp");
var file = new FileInfo(Path.Combine(dir.FullName, "file.ext"));
if (!file.Exists) // you may not want to overwrite existing files
{
    using (Stream stream = file.OpenWrite())
    using (StreamWriter writer = new StreamWriter(stream))
    {
        writer.Write("some text");
    }
}

顺便提一下:应该使用dir.FullName而不是dir.FullPath


哦,好的。FullPath 是受保护字段。FullName 是属性。我在 MSDN 成员页面上扫得有点太快了 :) - Svish

2

为什么不使用:

File.Create(@"C:\Temp\file.ext");

或者

var dir = new DirectoryInfo(@"C:\Temp");
File.Create(dir.FullName + "\\file.ext");

因为我有DirectoryInfo和文件名,但两者不在一起。 - Svish

1
虽然存在Directorynfo.GetFiles()方法,但它们只返回实际存在于磁盘上的文件。 Path.Combine 用于虚拟路径。
尝试使用这些扩展方法:
    public static FileInfo CombineWithFileName(this DirectoryInfo directoryInfo, string fileName)
    {
        return new FileInfo(Path.Combine(directoryInfo.Name, fileName));
    }

    public static DirectoryInfo CombineWithDirectoryName(this DirectoryInfo directoryInfo, string directoryName)
    {
        return new DirectoryInfo(Path.Combine(directoryInfo.Name, directoryName));
    }

7
我一直很失望 .NET 框架没有更进一步地封装路径成为一个丰富的类型。他们本可以跳过 FileInfoDirectoryInfo,把 Path 设计成实例类型,这样我们就能拥有更多的类型安全性,而今天我们只有字符串。 - Jay Bazuzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接