2012-01-30 2 views
448

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

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

+0

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

+0

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

+0

Возможный дубликат [Как создать каталог, если он не существует для создания файла?] (Https://stackoverflow.com/questions/2955402/how-do-i-create-directory-if-it-doesnt -exist-to-create-a-file) – brichins

ответ

797

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

Но, вам не нужно проверить, если он существует в первую очередь. Из docs

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

+118

+1 для указания, что проверка не нужна – Peter

+23

Для версии .NET Framework 4.5 фактическая цитата: «Если каталог уже существует, этот метод не создает новый каталог, но он возвращает объект DirectoryInfo для существующий каталог. "] (http://msdn.microsoft.com/en-us/library/54a0at6s%28v=vs.110%29.aspx) –

+7

, и все же пример кода Microsoftsoft противоречит самому себе, если проверить, существует ли каталог в первую очередь ... – ecoe

310

Используйте приведенный ниже код согласно 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)); 
+0

К сожалению, я пропустил добавление ссылки. – Ravia

+0

http://totaldotnet.com/Tip/ShowTip22_UsePhysicalAppPath.aspx Server.MapPath vs PhysicalApplicationPath. Вы согласны? – Jaime

+37

Почему нет: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check); – Dayan

24

Directory.Exists Это будет объяснить, как проверить, если FilePath Exist

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

+0

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

+0

Ссылка не работает .. –

+0

Ни одна из ссылок документации msdn, похоже, не работает в настоящий момент, даже через поиск msdn ... – jeroenh

12

Вы можете использовать пункт попробовать/поймать и проверить, если он существует:

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 создаются, если они уже не существуют или если некоторая часть пути недействительна. Параметр path указывает путь к каталогу, а не путь к файлу. Если каталог уже существует, этот метод ничего не делает. " Таким образом, вам действительно не нужен вызов Directory.Exists (путь). – ken

+1

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

+4

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

28

Вы можете создать путь, если он еще не существует с методом, как следующее:

using System.IO; 

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

Проверить 'if (! FolderExists)' не требуется. – bazzilic

+7

@bazzilic да, но это показывает намерение. Мне не нужно угадывать (или точно знать), как API обрабатывает это. Любой, кто читает этот код, точно знает, что произойдет. –

+3

В многопоточных средах (например, состояние файловой системы) у вас всегда есть выбор для блокировки или try-and-catch. Фрагмент выше имеет условие гонки. Функция может вызывать исключение «FileExists» (или что-то там, что оно вызывается в C#) –

1

Вы можете использовать Directory.Exist, чтобы проверить, если каталог существует, или нет.

15
using System.IO 

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

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

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

Ссылка: Article about Directory.CreateDirectory at MSDN

+8

Аккуратный код и объяснение! Вы, ребята, делаете опыт stackoverflow замечательным. – Martin

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

} 
10

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

Directory.CreateDirectory(path); 
+0

простой и короткий ответ – xameeramir

2

Использование ниже кода. Я использовал этот код для копирования файлов и создания новой папки.

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

    } 
} 
-1

производный/комбинированный из нескольких ответов, реализуя это для меня было так же просто, как это:

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

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

Какова цель инкапсулирования метода в то, что по существу является точной копией, только с немного другим именем? Вы буквально ничего не получаете от этого. – Krythic

0

струнной CreateFolder = "E:/TMP /" + UID;
System.IO.Directory.CreateDirectory (createfolder);

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

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

3

После кода лучшая линия (ы) кода я использую, что если нет будет создать каталог.

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

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

+0

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

+0

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

Смежные вопросы