如果文件夹不存在,请创建它

If a folder does not exist, create it

提问人:Tavousi 提问时间:1/30/2012 最后编辑:Bob KaufmanTavousi 更新时间:9/6/2023 访问量:1134364

问:

我在应用程序中使用控件。我想将文件保存到指定的文件夹。如果此文件夹不存在,我想先创建它,然后将我的文件保存到此文件夹。如果该文件夹已存在,则只需将文件保存在其中即可。FileUploader

我该怎么做?

C# asp.net 目录

评论

0赞 Bartosz 6/3/2016
@JoeBlow - 哈 - 应该指定哪个答案不正确 - 现在页面更加混乱。(他是否改变了接受的答案?还是没有?我的天啊!;-)
1赞 monkey0506 8/20/2017
我最终来到这里是在寻找其他东西时,但令人惊讶的是,有多少人正在与他们自己的同一故事版本相互矛盾。Microsoft 编写了 .NET Framework 和 MSDN。其他实现者(如 Mono)是否遵循正确的行为与 MSDN 中描述的行为的正确性无关。哦,Mono 也做了正确的事情,那么争论在哪里?
2赞 brichins 10/11/2017
如果目录不存在,如何创建目录以创建文件,则该目录的可能重复项?

答:

421赞 Ravi Vanapalli 1/30/2012 #1

按照如何使用文件上传服务器控件动态创建文件夹使用以下代码使用:

string subPath ="ImagesPath"; // Your code goes here

bool exists = System.IO.Directory.Exists(Server.MapPath(subPath));

if(!exists)
    System.IO.Directory.CreateDirectory(Server.MapPath(subPath));

评论

49赞 Dayan 4/1/2013
为什么不:如果(!Directory.Exists(path_to_check)) Directory.CreateDirectory(path_to_check);
184赞 bazzilic 7/12/2013
无需检查文件夹是否存在。请仔细阅读手册。
39赞 Jo So 9/20/2013
检查和创建不是原子的。上面的代码闻起来,有竞争条件。最好只是无条件地创建目录,并捕获(或任何 C# 等效项)异常,以防函数被设计为抛出异常。FileExists
9赞 Ed S. 7/2/2014
正如其他人所指出的,没有必要调用它,它实际上会创建一个新的故障条件。Exists
4赞 Jo So 9/18/2014
@MartinSmith:然后只需创建目录即可。以前不要检查是否存在。这不仅更短。它也不会给人一种 API 是什么的错误印象。(而且它更快,但可能没关系)System.IO.Directory.CreateDirectory
31赞 jeroenh 1/30/2012 #2

Directory.CreateDirectory 解释了如何尝试创建 FilePath(如果 FilePath 不存在)。

Directory.Exists 说明如何检查 FilePath 是否存在。但是,您不需要它,因为 CreateDirectory 会为您检查它。

评论

0赞 Allan Chua 1/30/2012
@Tavousi Jeroenh 提供的这个功能将是一个好的开始;)
0赞 ComFreek 8/21/2019
这将启用竞争条件,请参阅接受的答案
19赞 MethodMan 1/30/2012 #3

您可以使用 try/catch 子句并检查它是否存在:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }

评论

9赞 qxn 1/30/2012
这是一个很好的答案,但是,根据 MSDN 文档,“将创建 path 中指定的任何和所有目录,除非它们已经存在或路径的某些部分无效。path 参数指定目录路径,而不是文件路径。如果目录已存在,则此方法不执行任何操作。因此,您实际上并不需要调用 Directory.Exists(path)。
2赞 MethodMan 1/30/2012
这是真的,但这也是一个假设,所以最好检查一下,而不是假设,不管MSDN怎么说。
7赞 Polyfun 1/30/2012
@DJ KRAZE,我相信 MSDN,除非它已被证明是错误的。你建议相反 - 忽略 MSDN 所说的内容,并在代码中添加额外的(不必要的)检查。你在哪里划线?
1赞 MethodMan 1/31/2012
ShellShock 我无处可说忽略..这是一个放肆的说法,我是说不假设总比假设好。再读一遍我说过的话。谢谢
3赞 bazzilic 7/12/2013
@DJKRAZE没有人假设任何事情。手册中用通俗易懂的英语写成不需要检查。
29赞 Dennis Traub 1/30/2012 #4

如果路径尚不存在,可以使用如下方法创建路径:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}

评论

8赞 bazzilic 7/12/2013
不需要检查。if (!folderExists)
10赞 Dennis Traub 7/12/2013
@bazzilic是的,但它揭示了意图。我不必猜测(或确定)API 如何处理这个问题。任何读过这段代码的人都会确切地知道会发生什么。
5赞 Jo So 9/20/2013
在多线程环境(例如文件系统的状态)中,您只能选择锁定或尝试捕获。上面的代码片段具有争用条件。该函数可能会引发 Exception(或在 C# 中调用的任何函数)FileExists
13赞 Jim Balter 7/29/2014
“它揭示了意图”——这不是一个好的理由。你可以在代码中写一个注释。
13赞 BlackBear 1/30/2012 #5
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);
1507赞 Mark Peters 1/30/2012 #6
使用 System.IO.Directory.CreateDirectory

根据官方的“.NET”文档,你不需要先检查它是否存在。

System.io > Directory > Directory.CreateDirectory

将创建 中指定的任何和所有目录,除非它们已存在或某些部分无效。如果该目录已存在,则此方法不会创建新目录,但会返回现有目录的对象。pathpathDirectoryInfo

        — learn.microsoft.com/dotnet/api/

评论

47赞 Igor Kustov 1/16/2014
对于 .NET Framework 4.5 版本,实际引用为“如果目录已存在,则此方法不会创建新目录,但它会返回现有目录的 DirectoryInfo 对象。
53赞 ecoe 10/8/2014
然而,微软代码示例通过首先检查目录是否存在而自相矛盾......
6赞 Otávio Décio 3/14/2017
@Muflix像这样 - 创建一个文件,例如,在目录上“FILENAME”,但不要给它任何扩展名。然后尝试调用 Directory.Exists(“FILENAME”) 将返回 false,因为它应该返回,因为没有这样的目录。现在,如果您调用 CreateDirectory(“FILENAME”),它将按应有的方式惨遭失败,因为那里已经有具有该名称的“东西”。希望这是有道理的。
6赞 soddoff Baldrick 8/16/2019
错!I 您必须检查该文件夹是否存在。我刚刚发现这种方法存在严重问题。如果不检查文件夹是否存在,则文件夹句柄将泄漏,除非您专门释放它。我们在处理数百万个文件夹的应用程序中使用了此示例。每次调用此方法时,应用程序都会保留目录的文件句柄。几个小时后,企业网络 NAS 在文件夹上打开了数百万个文件句柄。更新以包括免费支票的句柄
7赞 Tom Lint 6/2/2020
@soddoffBaldrick 你一定在代码中犯了一些大错,因为 DirectoryDirectoryInfo 都没有对句柄做任何事情。最终,Directory.Create 归结为对 Win32 CreateDirectory 函数的调用链,并且该函数同样不对句柄执行任何操作。您的手柄泄漏在其他地方。
295赞 Nicolas Raoul 8/27/2014 #7

只需写下这一行:

System.IO.Directory.CreateDirectory("my folder");
  • 如果该文件夹尚不存在,则将创建该文件夹。
  • 如果该文件夹已存在,则将忽略该行。

参考:MSDN 上有关 Directory.CreateDirectory 的文章

当然,您也可以在源文件顶部使用 System.IO; 写入,然后每次要创建文件夹时都写入 Directory.CreateDirectory(“my folder”)。

-2赞 uksp 12/20/2014 #8
string root = @"C:\Temp";

string subdir = @"C:\Temp\Mahesh";

// If directory does not exist, create it.

if (!Directory.Exists(root))
{

Directory.CreateDirectory(root);

}

CreateDirectory 还用于创建子目录。您所要做的就是指定将在其中创建此子目录的目录的路径。以下代码片段在 中创建 Mahesh 子目录。C:\Temp directory

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}
19赞 Thakur Rock 12/30/2014 #9

如果文件夹不存在,此方法将创建该文件夹,如果该文件夹存在,则不执行任何操作:

Directory.CreateDirectory(path);

评论

3赞 Peter Mortensen 11/18/2020
这与2012年的答案有何不同?
0赞 Lemon Kazi 9/13/2015 #10

使用以下代码。我使用此代码进行文件复制和创建新文件夹。

string fileToCopy = "filelocation\\file_name.txt";
String server = Environment.UserName;
string newLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\file_name.txt";
string folderLocation = "C:\\Users\\" + server + "\\Pictures\\Tenders\\";
bool exists = System.IO.Directory.Exists(folderLocation);

if (!exists)
{
   System.IO.Directory.CreateDirectory(folderLocation);
   if (System.IO.File.Exists(fileToCopy))
   {
     MessageBox.Show("file copied");
     System.IO.File.Copy(fileToCopy, newLocation, true);
   }
   else
   {
      MessageBox.Show("no such files");
   }
}

评论

0赞 Peter Mortensen 11/18/2020
解释是有序的。它似乎做了更多的检查(?
-5赞 B. Clay Shannon-B. Crow Raven 10/29/2015 #11

从多个答案中推导出/组合,对我来说实现它就这么简单:

public void Init()
{
    String platypusDir = @"C:\platypus";
    CreateDirectoryIfDoesNotExist(platypusDir);
}

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}

评论

7赞 Krythic 2/23/2018
将方法封装到本质上是一个精确副本中,只有名称略有不同,这有什么意义?从字面上看,你什么也得不到。
0赞 Lukas 2/28/2023
@Krythic 封装的一个原因可能是文档。目前尚不清楚仅当仅从语句中不存在目录时,才会创建该目录。但正如这个帖子中的某个人所提到的,他可以写一条评论来解释这一点。CreateDirectory
15赞 Kiran Solkar 12/15/2015 #12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

评论

4赞 bergmeister 11/16/2017
如果目录不存在,CreateDirectory 已处理检查。
9赞 UJS 11/25/2016 #13

以下代码是我使用的最佳代码行,如果不存在,它将创建目录。

System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/temp/"));

如果目录已存在,则此方法不会创建新目录,但会返回现有目录的 DirectoryInfo 对象。>

评论

0赞 bergmeister 11/16/2017
如果目录不存在,CreateDirectory 已处理检查。
0赞 UJS 11/17/2017
@bergmeister,谢谢。我刚刚交叉检查.它确实删除了条件检查。更新!!
10赞 BenKoshy 8/9/2018 #14

创建一个新文件夹,给定父文件夹的路径:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • 给定新文件夹的路径
  • 目录信息变量,以便您可以继续随心所欲地操作它。
3赞 Jogi 2/12/2020 #15

如果文件夹未显示在图像文件夹或其他文件夹下,请使用此代码

string subPath = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/");

bool exists = System.IO.Directory.Exists(subPath);
if(!exists)
    System.IO.Directory.CreateDirectory(subPath);

string path = HttpContext.Current.Server.MapPath(@"~/Images/RequisitionBarCode/" + OrderId + ".png");
-1赞 MiguelSlv 2/22/2020 #16

一种奇特的方法是使用您想要的方法扩展。FileUpload

添加以下内容:

public static class FileUploadExtension
{
    public static void SaveAs(this FileUpload, string destination, bool autoCreateDirectory) { 

        if (autoCreateDirectory)
        {
            var destinationDirectory = new DirectoryInfo(Path.GetDirectoryName(destination));

            if (!destinationDirectory.Exists)
                destinationDirectory.Create();
        }

        file.SaveAs(destination);
    }
}

然后使用它:

FileUpload file;
...
file.SaveAs(path,true);

评论

0赞 Peter Mortensen 11/18/2020
但是类在任何地方都没有使用(?FileUploadExtension
0赞 Peter Mortensen 11/18/2020
“扩展 FileUpload”是什么意思?
0赞 MiguelSlv 11/18/2020
@PeterMortensen learn.microsoft.com/en-us/dotnet/csharp/programming-guide/....在我的解决方案中,SaveAs 方法具有另一个版本,其中包含第二个参数,该参数告诉是否创建目录。保存新方法的类的名称必须与我要扩展的类不同。这可能会引起混乱,但事实就是如此。
0赞 chj915 9/6/2023 #17

通过查看上面的答案,显然很多人仍然不知道“Directory.CreateDirectory”,或者他们没有仔细阅读官方文档。

enter image description here

评论

0赞 Jeremy Caney 9/6/2023
几乎所有得票最高的答案都提到了这一点。具体来说,你的批评是什么?
0赞 Ben A. 9/8/2023
虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 从评论