Якщо папки не існує, створіть її


720

У своїй програмі я використовую елемент управління FileUploader. Я хочу зберегти файл у вказаній папці. Тепер я хочу, якщо цієї папки не існує, спершу створити її, а потім зберегти мій файл у цій папці. Якщо папка вже існує, то просто збережіть у ній файл.

Як я можу це зробити?


@JoeBlow - Ha - повинен був вказати, яка відповідь неправильна - тепер сторінка ще більше заплутана. (Чи змінив він прийняту відповідь? Чи ні? OMG!) ;-)
Bartosz

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

Відповіді:


1239

Як казали інші, використовуйте System.IO.Directory.CreateDirectory

Але вам не потрібно перевіряти, чи існує він спочатку. Від док

Будь-які та всі каталоги, вказані на шляху, створені, якщо вони вже не існують або якщо частина частини шляху недійсна. Якщо каталог вже існує, цей метод не створює новий каталог, але він повертає об’єкт DirectoryInfo для існуючого каталогу.



25
і все ж приклад коду
мікрософт

1
Отже, ми повинні перевірити, чи існує він чи ні? Якщо ми перевіримо, а потім ще раз перевіримо метод CreateDirectory, ми зробимо перевірку два рази ... і робота файлової системи AFAIK дорога
Giox

3
@Muflix на кшталт цього - створіть файл, наприклад, "FILENAME" в каталозі, але не дайте йому жодного розширення. Потім спробуйте зателефонувати в Directory.Exists ("FILENAME") поверне помилкове значення, як слід, тому що такого каталогу немає. Тепер, якщо ви зателефонуєте на CreateDirectory ("FILENAME"), він вийде з ладу як слід, тому що там вже є "щось" з цим ім'ям. Сподіваюся, що це має сенс.
Otávio Décio

1
НЕ ПРАВО! Я ТИ ПОВИНЕН перевірити, чи існує папка. Я лише визначив, що у цього методу є серйозна проблема. Якщо ви не перевірите наявність папки, ручка папки просочиться, якщо ви спеціально не випустите її. Цей приклад ми використовували в додатку, який обробляє мільйони папок. Кожного разу, коли цей метод викликався, програма зберігала ручку файлів у каталозі. Через кілька годин Корпоративна мережа NAS відкрила мільйони файлових ручок на папках. Оновлення, щоб включити чек-фрі, ручка
содовий Балдрік

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
Чому б і ні: якщо (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Даян

158
Немає необхідності перевіряти, чи існує папка. Уважно прочитайте посібник.
bazzilic

30
Перевірка та створення не є атомним. Вищевказаний код пахне, є умова гонки. Вам краще просто беззастережно створити каталог і вилучити FileExists(або будь-який еквівалент C #) у випадку, якщо функція призначена для викидання.
Jo So

6
Як і інші вказували, немає необхідності у виклику, Existsі це фактично створює нову умову відмови.
Ред С.

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

223

Просто напишіть цей рядок:

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, було б гарним початком;)
Allan Chua

наразі жодне з посилань на документацію msdn не працює, навіть через пошук
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)не потрібна.
bazzilic

8
@bazzilic так, але це виявляє наміри. Мені не доведеться здогадуватися (або точно знати), як API справляється з цим. Кожен, хто прочитає цей код, точно знатиме, що буде.
Денніс Трауб

4
У багатопотокових середовищах (таких як стан файлової системи) у вас є лише вибір блокування або спробувати. Розташований вище фрагмент має перегони. Функція може кинути FileExistsвиняток (або як воно ще називається в C #)
Jo So

9
"це виявляє наміри" - Це не є хорошим виправданням. Ви можете просто написати коментар у коді.
Джим Балтер

15

Цей метод створить папку, якщо вона не існує, і нічого не зробить, якщо вона існує

Directory.CreateDirectory(path);

15

Ви можете скористатися пунктом пробування / лову і перевірити, чи існує:

  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 ніхто нічого не припускає. У посібнику написано простою англійською мовою, що перевіряти не потрібно.
bazzilic


12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}

3
CreateDirectory вже обробляє чек, якщо каталог не існує.
bergmeister

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

string createfolder = "E: / tmp /" + uId;
System.IO.Directory.CreateDirectory (створення папки);


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.