Если папка не существует, создайте ее


720

Я использую элемент управления FileUploader в моем приложении. Я хочу сохранить файл в указанной папке. Теперь я хочу, если эта папка не существует, сначала создать ее, а затем сохранить мой файл в эту папку. Если папка уже существует, просто сохраните в ней файл.

Как я могу это сделать?


@JoeBlow - Ха - должен был указать, какой ответ неправильный - теперь страница еще более запутана. (Он изменил принятый ответ? Или нет? OMG!) ;-)
Bartosz

Я оказался здесь в поисках других вещей, но удивительно, как много людей борются, чтобы противоречить друг другу с их собственной версией той же истории. Microsoft является автором .NET Framework и MSDN. То, соблюдается ли правильное поведение другими исполнителями, такими как Mono, не имеет значения для правильности поведения, описанного в MSDN. О, и Моно делает правильные вещи, так где же аргумент?
monkey0506

Ответы:


1239

Как уже говорили другие, используйте System.IO.Directory.CreateDirectory

Но вам не нужно проверять, существует ли он первым. Из документов

Любые и все каталоги, указанные в path, создаются, если они не существуют или если какая-то часть пути недопустима. Если каталог уже существует, этот метод не создает новый каталог, но возвращает объект DirectoryInfo для существующего каталога.



25
и все же пример кода Microsoft противоречит самому себе, проверяя, существует ли каталог первым ...
ecoe

1
Таким образом, мы должны проверить, существует ли он или нет? Если мы проверяем, а затем снова проверяем метод CreateDirectory, мы делаем проверку два раза ... и операция с файловой системой
AFAIK обходится

3
@Muflix, как это - создайте файл, например, «FILENAME» в каталоге, но не дайте ему никакого расширения. Затем попробуйте вызвать Directory.Exists ("FILENAME") и вернет false, как и должно быть, потому что такого каталога нет. Теперь, если вы вызовете CreateDirectory ("FILENAME"), он потерпит неудачу, как и должно быть, потому что там уже есть что-то с таким именем. Надеюсь, что это имеет смысл.
Otávio Décio

1
НЕПРАВИЛЬНО! Вы ДОЛЖНЫ проверить, существует ли папка. Я только определил, что у этого метода есть серьезная проблема. Если вы не проверяете наличие папки, дескриптор папки будет течь, если вы не отпустите ее. Мы использовали этот пример в приложении, которое обрабатывает миллионы папок. Каждый раз, когда вызывался этот метод, приложение сохраняло дескриптор файла в каталоге. Через несколько часов в корпоративной сети 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);
Даян

159
Не нужно проверять, существует ли папка. Внимательно прочитайте инструкцию.
Базилик

30
Проверка и создание не атомарны. Приведенный выше код пахнет, есть условие гонки. Лучше просто безоговорочно создать каталог и поймать FileExists(или любой другой эквивалент C #) исключение в случае, если функция предназначена для его выброса.
Джо Со

6
Как уже отмечали другие, для вызова нет необходимости, Existsи это фактически создает новое условие отказа.
Эд С.

3
@MartinSmith: тогда просто создайте каталог. Не проверяйте существование раньше. Это не только короче. Это также не дает ложного представления о том, что такое API System.IO.Directory.CreateDirectory. (И это быстрее, но, вероятно, это не имеет значения)
Jo So

225

Просто напишите эту строку:

System.IO.Directory.CreateDirectory("my folder");
  • Если папка еще не существует , она будет создана .
  • Если папка уже существует , строка будет проигнорирована .

Ссылка: Статья о Directory.CreateDirectory на MSDN

Конечно, вы также можете написать using System.IO;в верхней части исходного файла, а затем просто писать Directory.CreateDirectory("my folder");каждый раз, когда вы хотите создать папку.


28

Directory.CreateDirectory Объясняет, как попытаться создать FilePath, если он не существует

Directory.ExistsОбъясняет, как проверить, существует ли FilePath. Однако вам это не нужно, так как CreateDirectory проверит вас.


@Tavousi это функции, предоставляемые jeroenh, было бы хорошим началом;)
Аллан Чуа

ни одна из ссылок на документацию по
msdn

ссылки в порядке сейчас
Ананд

Это включает условия гонки, см. Принятый ответ .
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
«Это показывает намерение» - это не хорошее оправдание. Вы можете просто написать комментарий в коде.
Джим Балтер

15

Этот метод создаст папку, если она не существует, и ничего не сделает, если существует

Directory.CreateDirectory(path);

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

8
Это хороший ответ, но, согласно документации MSDN, «создаются все каталоги, указанные в пути, если они уже не существуют или если какая-то часть пути недопустима. Параметр пути указывает путь к каталогу, а не путь к файлу». . Если каталог уже существует, этот метод ничего не делает. " Таким образом, вам не нужен вызов Directory.Exists (путь).
Кен

2
Это правда, но это также предположение, поэтому всегда лучше проверять, чем предполагать, независимо от того, что говорится в MSDN ..
MethodMan

6
@DJ KRAZE, я верю MSDN, если не было доказано, что это неправильно. Вы рекомендуете обратное - игнорируйте слова MSDN и добавляйте дополнительные (ненужные) проверки в свой код. Где вы проводите линию?
Полифун

1
ShellShock я нигде не говорю игнорировать .. это убедительное утверждение, я говорю, что лучше не предполагать, чем предполагать .. прочитайте то, что я сказал еще раз .. спасибо
MethodMan

3
@ DJKRAZE никто ничего не принимает. В руководстве написано простым английским языком, что проверка не нужна.
Базилик



6

Следующий код - лучшая строка (и) кода, который я использую, который создаст каталог, если его нет.

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

Если каталог уже существует, этот метод не создает новый каталог, но возвращает объект DirectoryInfo для существующего каталога. >


CreateDirectory уже обрабатывает проверку, если каталог не существует.
Бергмайстер

@bergmeister, спасибо. Я только что пересек, проверил. Он действительно убрал условную проверку. Обновлен !!
UJS

5

Создайте новую папку, указав путь к родительской папке:

        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

Используйте этот код, если папка отсутствует в папке изображений или других папках

 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
Какой смысл инкапсулировать метод в то, что по сути является точной копией с немного другим именем? Вы буквально ничего не получаете от этого.
Крит,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.