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


720

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

我该怎么做?


@JoeBlow-哈-应该指定哪个答案不正确-现在页面更加混乱。(他更改了接受的答案吗?还是没有?OMG!);-)
Bartosz

我在这里寻找其他事物的时候到了这里,但是令人惊讶的是,有多少人正在为自己同一个故事的版本互相矛盾。Microsoft编写了.NET Framework和MSDN。其他实现者(例如Mono)是否尊重正确的行为与MSDN中描述的行为的正确性无关。哦,Mono也做正确的事情,所以论点在哪里?
monkey0506

Answers:


1238

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

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

除非在路径中指定的目录已经存在或者路径的某些部分无效,否则将创建该目录中指定的所有目录。如果目录已经存在,则此方法不会创建新目录,但会为现有目录返回DirectoryInfo对象。



25
但是,Microsoft代码示例通过检查目录是否首先存在来与自身矛盾……
ecoe 2014年

1
因此,我们必须检查它是否存在?如果我们进行检查,然后再次进行CreateDirectory方法检查,我们将进行两次检查...并且AFAIK文件系统操作非常昂贵
Giox

3
像这样的@Muflix-在目录上创建一个文件,例如“ FILENAME”,但不要给它任何扩展名。然后尝试调用Directory.Exists(“ FILENAME”)将返回false,这是因为没有这样的目录。现在,如果您调用CreateDirectory(“ FILENAME”),它将失败,因为它应该已经失败了,因为那里已经有了该名称的“东西”。希望有道理。
奥塔维奥·德西奥(OtávioDécio)

1
错误!I您必须检查文件夹是否存在。我刚刚确定该方法存在严重问题。如果您不检查文件夹是否存在,则除非您专门释放它,否则文件夹句柄将泄漏。我们在处理数百万个文件夹的应用程序中使用了此示例。每次调用此方法时,应用程序都会将文件句柄保留到目录中。几个小时后,企业网络NAS在文件夹上打开了数百万个文件句柄。更新以包括免提支票
soddoff Baldrick

356

按照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));

41
为什么不这样:if(!Directory.Exists(path_to_check))Directory.CreateDirectory(path_to_check);
2013年

158
无需检查文件夹是否存在。请仔细阅读本手册。
巴西残酷的

30
检查和创建不是原子的。上面的代码闻起来,有一个竞争条件。您最好只是无条件地创建目录,并捕获一个FileExists(或任何与C#等效的)异常,以防该函数被设计为抛出一个异常。
Jo So

6
就像其他人指出的那样,不需要调用Exists它,它实际上会创建一个新的失败条件。
Ed S.

3
@MartinSmith:然后只需创建目录。之前不要检查是否存在。那不仅短。它也不会给人错误的API印象System.IO.Directory.CreateDirectory。(而且速度更快,但可能没关系)
Jo So


28

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

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


@Tavousi由jeroenh提供的此功能将是一个不错的开始;)
Allan Chua

目前,即使通过msdn搜索,msdn文档链接似乎也无法正常工作……
jeroenh 2015年

链接都很好,现在
阿南德

这将启用竞赛条件,请参见接受的答案
ComFreek

27

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

using System.IO;

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

6
if (!folderExists)不需要检查。
巴西残酷的

8
@bazzilic是的,但它揭示了意图。我不必猜测(或肯定知道)API是如何处理的。任何阅读此代码的人都会确定会发生什么。
丹尼斯·特劳布

4
在多线程环境(例如文件系统的状态)中,您只能选择锁定或尝试并捕获。上面的代码段具有竞争条件。该函数可能会引发FileExists异常(或任何在C#中调用的异常)
Jo So

9
“显示意图”-这不是一个很好的理由。您可以在代码中写一个注释。
Jim Balter 2014年

15

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

Directory.CreateDirectory(path);

14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);

14

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

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

8
这是一个很好的答案,但是根据MSDN文档,“将创建路径中指定的所有目录,除非它们已经存在或者路径的某些部分无效。path参数指定目录路径,而不是文件路径。如果目录已经存在,则此方法不执行任何操作。” 因此,您实际上不需要调用Directory.Exists(path)。
2012年

2
这是事实,但是这也是一个assumtion所以它总是最好的检查,而不是无论承担什么MSDN说..
MethodMan

6
@DJ KRAZE,我相信MSDN除非被证明是错误的。您建议采取相反的做法-忽略MSDN所说的内容,并在代码中添加额外的(不必要的)检查。您在哪里划界线?
Polyfun 2012年

1
ShellShock我无处可说。..这是一个有说服力的声明,我说最好是不要假设而不是假设..再读一次我所说的..谢谢
MethodMan 2012年

3
@DJKRAZE没有人承担任何责任。手册中用简单的英语写着,不需要检查。
巴西残酷的


6

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

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

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


如果目录不存在,CreateDirectory已经处理了检查。
bergmeister

@bergmeister,谢谢。我刚刚越过检查。它确实删除了条件检查。已更新!
UJS

4

这是我一直在寻找的答案,但没有找到:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • 给定新文件夹的路径
  • 目录信息变量,因此您可以根据需要继续对其进行操作。

0

使用下面的代码。我使用此代码进行文件复制并创建了新文件夹。

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

字符串createfolder =“ E:/ tmp /” + uId;
System.IO.Directory.CreateDirectory(createfolder);


0

如果文件夹没有出现在图像文件夹或其他文件夹下,请使用此代码

 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

一种不错的方法是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);

-3
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);

}

-5

从多个答案派生/组合而成,对我来说,实现起来就像这样简单:

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

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

6
将方法封装到本质上是一个完全相同的副本(名称仅稍有不同)的意义何在?从字面上您什么也得不到。
Krythic '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.