如何在一个方法调用中创建文件及其父目录?

10

我想创建一个位于特定目录中的文件。 例如:C:\x\y\z\aTextFile.txt

为了进行此操作,我必须先创建目录以创建文件。

Directory.CreateDirectory(@"C:\x\y\z\");
File.Create(@"C:\x\y\z\aTextFile.txt");

不过我真的很想知道是否可以用一行代码完成这个操作。

任何帮助和想法将不胜感激。


2
为什么将其简化为使用特定于 .Net 框架的方法如此重要? - Chris Moutray
6个回答

5
简单:添加一个函数
void MySingleLineOfCodeFunction(string path, string filename)
{
    Directory.Createdirectory(path);
    File.Create(filename).Dispose();
}

然后只需使用一行代码:

MySingleLineOfCodeFunction(@"C:\x\y\z\", "a.txt");

我想表达的是,代码之间没有区别。有些是由微软的工程师编写的,而另一些则是由我们这些普通人编写的。但是电脑并不会区别它们。:)


我有一个像这样的方法,但如果可能的话,我想将这两行代码缩减为一行。 - ibrahimyilmaz
2
你将它简化成了一行代码,通过将其组合成一个方法。你的方法调用这两个API与某些调用这两个API的Microsoft函数之间没有区别。你仍然必须进行两次调用,一次是目录,一次是文件。 - Scott Chamberlain
我认为有一种使用内置的C#方法来完成这个任务,但是如果没有也没关系 :) - ibrahimyilmaz
我们可以说除了方法提取之外,没有别的方法可以做到这一点 :) 很抱歉,伙计们。 - ibrahimyilmaz
请修复提供的示例代码,使用参数而不是硬编码字符串。 - Larry
显示剩余2条评论

3
据我所知,在.NET框架中没有同时创建目录和文件的方法。
如果在您的代码中反复出现“检查/创建目录,然后创建文件”的模式,您需要将其实现为一个方法。

2
很遗憾,没有一行代码可以做到你想要的。为什么?因为即使我们通过一些Microsoft内置函数这样做,内部也会调用两种方法。一个用于创建目录,另一个用于创建文件。但是,你可以通过将它们变成一个方法并在单行中调用它来减少代码行数,就像Petar Ivanov所说的那样。
或者,你可以创建一个静态扩展方法。这样,你可以在其他地方使用它而不必创建实例。(减少了创建实例的一行)。

由于File是静态类型,您将无法为File创建扩展方法。 - Prashanth Thurairatnam

2

我修改了来自@Petar_Ivanov的答案,以便根据文件路径计算出父目录,认为这可能对其他想要类似功能的人有用。

    public void CreateFile(string filePath)
    {
        if (!File.Exists(filePath))
        {
            var parent = Directory.GetParent(filePath);
            Directory.CreateDirectory(parent.FullName);
            File.Create(filePath).Dispose();
        }
    }

1

创建文件时,不,目录必须存在。即使使用Visual Basic的文件友好类,您仍然需要先创建目录。有趣的是,移动将创建文件夹。

来自CreateFile http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

目录

应用程序无法使用CreateFile创建目录,因此对于此用例,仅OPEN_EXISTING值有效于dwCreationDisposition。要创建目录,应用程序必须调用CreateDirectory或CreateDirectoryEx。


+1. 你比我先完成了 :) 这不是.NET框架的限制,而是Win32 API的限制。 - Eren Ersönmez

0

在我的代码块中,我通常会在创建文件之前处理文件夹的存在。

public void CheckCreatePath(fileName)
{
    string filePath = Directory.GetParent(fileName).ToString();
    if (!Directory.Exists(filePath))
        Directory.CreateDirectory(filePath);
}

只需要使用

CheckCreatePath("C:\\TEMP\\TESTPath\\myFile.txt");

在你的代码块中。


如果\TEMP不存在,这个代码还能正常工作吗?问题中提到了“父目录”。 - Old Geezer

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