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

Tav*_*usi 667 c# asp.net directory

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

我怎么能这样做?

Mar*_*ers 1171

正如其他人所说,使用 System.IO.Directory.CreateDirectory

但是,您不需要先检查它是否存在.来自文档

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

  • +1表示不需要支票 (207认同)
  • 对于.NET Framework 4.5版本,实际报价为["如果该目录已存在,则此方法不会创建新目录,但会返回现有目录的DirectoryInfo对象."](http://msdn.microsoft. COM/EN-US /库/ 54a0at6s%28V = vs.110%29.aspx) (30认同)
  • 然而,微软代码示例通过检查目录是否存在而自相矛盾... (21认同)
  • `CreateDirectory()` **将愉快地创建路径中的所有目录。**无需将其放入循环中。 (4认同)
  • @Muflix是这样的 - 在目录上创建一个文件,例如"FILENAME",但不给它任何扩展名.然后尝试调用Directory.Exists("FILENAME")将返回false,因为它应该没有这样的目录.现在,如果您调用CreateDirectory("FILENAME"),它将会失败,因为它已经存在具有该名称的"东西".希望有道理. (3认同)
  • 错误的!I 您必须检查该文件夹是否存在。我刚刚发现这个方法有一个严重的问题。如果您不检查文件夹是否存在,则文件夹句柄将泄漏,除非您专门释放它。我们在处理数百万个文件夹的应用程序中使用了此示例。每次调用此方法时,应用程序都会保留该目录的文件句柄。几个小时后,企业网络 NAS 的文件夹上打开了数百万个文件句柄。更新以包含免费支票的句柄 (3认同)
  • @ecoe 哈哈。我不会说它自相矛盾,它只是选择检查它是否存在,您总是可以自由地这样做(您可能想知道它是否存在并采取不同的操作,而不希望返回现有的 DirectoryInfo 对象)。 (3认同)
  • 除非您有一个与目录同名的文件。这将表明 Directory.Exists(path) 为 false,并且在调用 CreateDirectory(path) 时失败。 (2认同)
  • @soddoffBaldrick你一定在你的代码中做了一些非常错误的事情,因为 [Directory](https://referencesource.microsoft.com/#mscorlib/system/io/directory.cs) 和 [DirectoryInfo](https://referencesource .microsoft.com/#mscorlib/system/io/directoryinfo.cs) 使用句柄执行任何操作。最终,Directory.Create 归结为对 Win32 CreateDirectory 函数的一系列调用,而该函数同样不会对句柄执行任何操作。你的手柄泄漏在其他地方。 (2认同)

Rav*_*via 343

根据http://forums.asp.net/p/1226236/2209871.aspx使用以下代码:

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));
Run Code Online (Sandbox Code Playgroud)

  • 无需检查文件夹是否存在.请仔细阅读本手册. (156认同)
  • 为什么不:if(!Directory.Exists(path_to_check))Directory.CreateDirectory(path_to_check); (41认同)
  • 检查和创建不是原子的.上面的代码闻起来,有一个竞争条件.你应该更好地无条件地创建目录,并捕获`FileExists`(或任何C#等价物)异常,以防函数被设计为抛出一个. (30认同)
  • 正如其他人所指出的那样,没有必要调用"存在",它实际上创造了一个新的失败条件. (6认同)
  • @MartinSmith:然后只需创建目录.之前不要检查是否存在.这不仅更短.它也没有给出'System.IO.Directory.CreateDirectory`的API是错误的印象.(它更快,但可能没关系) (3认同)

Nic*_*oul 211

只需写下这一行:

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

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


jer*_*enh 28

Directory.CreateDirectory 这将解释如何检查FilePath是否存在

Directory.Exists 这将解释如何尝试创建FilePath(如果它不存在)


Den*_*aub 27

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

using System.IO;

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

  • "它揭示了意图" - 你的键盘不能产生评论吗?你的确是一个可怕的理由. (9认同)
  • @bazzilic是的,但它揭示了意图.我不必猜测(或肯定地知道)API如何处理这个问题.任何阅读此代码的人都会确切知道会发生什么. (7认同)
  • 检查`if(!folderExists)`是否不需要. (6认同)
  • 在多线程环境(例如文件系统的状态)中,您只能选择锁定或try-and-catch.上面的片段有竞争条件.该函数可能抛出一个`FileExists`异常(或者在C#中调用的任何异常) (4认同)

Met*_*Man 15

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

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

  • 这是一个很好的答案,但是,根据MSDN文档,"创建路径中指定的任何和所有目录,除非它们已经存在或除非路径的某些部分无效.path参数指定目录路径,而不是文件路径如果目录已存在,则此方法不执行任何操作." 所以,你真的不需要调用Directory.Exists(path). (8认同)
  • @DJ KRAZE,我相信MSDN,除非它被证明是错误的.您建议相反 - 忽略MSDN所说的内容并在代码中添加额外的(不必要的)检查.你在哪里划线? (5认同)
  • @DJKRAZE没有人假设什么.手册中用英文写成,不需要检查. (3认同)
  • 没错,但这也是假设,因此无论MSDN说什么,总是最好检查而不是假设。 (2认同)

Bla*_*ear 15

using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);
Run Code Online (Sandbox Code Playgroud)


小智 15

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

Directory.CreateDirectory(path);
Run Code Online (Sandbox Code Playgroud)

  • 这与 2012 年的答案有何不同? (3认同)

Kir*_*kar 13

if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}
Run Code Online (Sandbox Code Playgroud)

  • CreateDirectory已经处理检查目录是否不存在. (3认同)

UJS*_*UJS 6

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

System.IO.Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/temp/"));
Run Code Online (Sandbox Code Playgroud)

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


BKS*_*eon 5

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

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
Run Code Online (Sandbox Code Playgroud)
  • 给定新文件夹的路径
  • 目录信息变量,以便您可以继续随意操作它。