Se uma pasta não existir, crie-a

720

Eu uso um controle FileUploader no meu aplicativo. Eu quero salvar um arquivo em uma pasta especificada. Agora, se essa pasta não existir, primeiro crie-a e salve meu arquivo nessa pasta. Se a pasta já existir, salve o arquivo nela.

Como posso fazer isso?

Tavousi
fonte
@ JoeBlow - Ha - deveria ter especificado qual resposta está incorreta - agora a página é ainda mais confusa. (Será que ele mude a resposta aceite ou não o fez OMG?!) ;-)
Bartosz
Eu acabei aqui procurando outras coisas, mas é incrível quantas pessoas estão lutando para se contradizerem com sua própria versão da mesma história. A Microsoft criou o .NET Framework e o MSDN. Se o comportamento correto é respeitado por outros implementadores, como o Mono, é irrelevante para a correção do comportamento descrito no MSDN. Ah, e Mono faz a coisa certa também, então, onde está o argumento?
monkey0506

Respostas:

1239

Como outros já disseram, use System.IO.Directory.CreateDirectory

Mas você não precisa verificar se existe primeiro. Dos documentos

Todo e qualquer diretório especificado no caminho é criado, a menos que já exista ou a menos que parte do caminho seja inválida. Se o diretório já existir, esse método não criará um novo diretório, mas retornará um objeto DirectoryInfo para o diretório existente.

Mark Peters
fonte
25
e, no entanto, o exemplo de código da microsoft se contradiz verificando se o diretório existe primeiro ...
ecoe
1
Então temos que verificar se existe ou não? Se verificar e, em seguida, também a verificação método CreateDirectory novamente, fazemos a verificação duas vezes ... e operação AFAIK sistema de arquivos são caros
Giox
3
@Muflix como este - crie um arquivo, por exemplo, "FILENAME" em um diretório, mas não dê nenhuma extensão. Em seguida, tente chamar Directory.Exists ("FILENAME") retornará false, como deveria, porque não existe esse diretório. Agora, se você chamar CreateDirectory ("FILENAME"), ele falhará miseravelmente como deveria, porque já existe "algo" com esse nome. Espero que isso faça sentido.
Otávio Décio
1
ERRADO! I Você DEVE verificar se a pasta existe. Acabei de identificar que este método tem um problema sério. Se você não verificar a existência da pasta, o identificador de Pasta vazará, a menos que você a libere especificamente. Usamos este exemplo em um aplicativo que processa milhões de pastas. Sempre que esse método foi chamado, o aplicativo reteve o identificador do arquivo no diretório Depois de várias horas, o NAS da rede corporativa tinha milhões de identificadores de arquivos abertos nas pastas. Atualizando para incluir a verificação gratuita, o identificador
soddoff Baldrick 16/08/19
356

Use o código abaixo conforme 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));
Ravia
fonte
41
Por que não: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan
159
Não há necessidade de verificar se a pasta existe. Leia o manual atentamente.
bazzilic
30
Verificar e criar não é atômico. O código acima cheira, há uma condição de corrida. É melhor criar incondicionalmente o diretório e capturar uma FileExistsexceção (ou qualquer que seja o equivalente em C #) caso a função seja projetada para gerar um.
Jo Então,
6
Como outros já apontaram, não há necessidade de fazer a chamada Existse ela realmente cria uma nova condição de falha.
Ed S.
3
@ MartinSmith: Em seguida, basta criar o diretório. Não verifique a existência antes. Isso não é apenas mais curto. Também não dá uma impressão falsa do que é a API System.IO.Directory.CreateDirectory. (E é mais rápido, mas provavelmente isso não importa)
Jo Então
224

Basta escrever esta linha:

System.IO.Directory.CreateDirectory("my folder");
  • Se a pasta ainda não existir , ela será criada .
  • Se a pasta já existir , a linha será ignorada .

Referência: artigo sobre Directory.CreateDirectory no MSDN

Obviamente, você também pode escrever using System.IO;na parte superior do arquivo de origem e apenas escrever Directory.CreateDirectory("my folder");toda vez que quiser criar uma pasta.

Nicolas Raoul
fonte
28

Directory.CreateDirectory Explica como tentar criar o FilePath se ele não existir.

Directory.ExistsExplica como verificar se existe um FilePath. No entanto, você não precisa disso, pois o CreateDirectory procurará por você.

jeroenh
fonte
@Tavousi este funções fornecidas pelo jeroenh seria bom começo;)
Allan Chua
nenhum dos links de documentação do msdn parece estar funcionando no momento, mesmo através da pesquisa do msdn ...
jeroenh
os links estão bem agora
Anand
Isso permite condições de corrida, consulte o resposta aceita .
ComFreek 21/08/19
27

Você pode criar o caminho se ele ainda não existir com um método como o seguinte:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}
Dennis Traub
fonte
6
A verificação if (!folderExists)não é necessária.
bazzilic
8
@bazzilic sim, mas revela intenção. Não preciso adivinhar (ou ter certeza) como a API lida com isso. Quem ler este código saberá com certeza o que acontecerá.
Dennis Traub
4
Em ambientes multithread (como o estado de um sistema de arquivos), você só tem a opção de bloquear ou tentar e capturar. O trecho acima tem uma condição de corrida. A função pode lançar uma FileExistsexceção (ou o que é chamado em C #)
Jo Então
9
"revela intenção" - Esta não é uma boa justificativa. Você pode apenas escrever um comentário no código.
Jim Balter
15

Este método criará uma pasta se não existir e não fará nada se existir

Directory.CreateDirectory(path);
Thakur Rock
fonte
15

Você pode usar uma cláusula try / catch e verificar se ela existe:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }
Homem metódico
fonte
8
Essa é uma boa resposta, mas, de acordo com a documentação do MSDN, "Todo e qualquer diretório especificado no caminho foi criado, a menos que ele já exista ou a parte do caminho seja inválida. O parâmetro path especifica um caminho do diretório, não um caminho do arquivo. Se o diretório já existir, este método não fará nada. " Portanto, você realmente não precisa da chamada para Directory.Exists (caminho).
ken
2
Isso é verdade, mas isso é também um assumtion por isso é sempre melhor verificar em vez de assumir independentemente do que MSDN diz ..
MethodMan
6
@ DJ KRAZE, acredito no MSDN, a menos que se prove que está errado. Você recomenda o contrário - ignore o que o MSDN diz e adicione verificações extras (desnecessárias) ao seu código. Onde você desenha a linha?
precisa saber é
1
ShellShock nenhum lugar que eu digo ignorar .. esta é uma declaração persumtious estou dizendo que é melhor não assumir do que assumir .. ler o que eu tenho dito, mais uma vez .. obrigado
MethodMan
3
@DJKRAZE ninguém está assumindo nada. Está escrito em inglês simples no manual que a verificação não é necessária.
bazzilic
14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);
Urso preto
fonte
12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}
Kiran Solkar
fonte
3
O CreateDirectory já lida com a verificação se o diretório não existe.
Bergmeister
6

O código a seguir é a melhor (s) linha (s) de código que eu uso que criará o diretório se não estiver presente.

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

Se o diretório já existir, esse método não criará um novo diretório, mas retornará um objeto DirectoryInfo para o diretório existente. >

UJS
fonte
O CreateDirectory já lida com a verificação se o diretório não existe.
Bergmeister
@bergmeister, Obrigado. Acabei de cruzar a verificação. Realmente removeu a verificação condicional .Atualizada !!
UJS
5

Crie uma nova pasta, conforme o caminho da pasta pai:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • caminho para a nova pasta fornecida
  • variável de informações do diretório para que você possa continuar a manipulá-lo como desejar.
BKSpurgeon
fonte
0

Use o código abaixo. Eu usei esse código para copiar arquivos e criar uma nova pasta.

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

   }
}
Lemon Kazi
fonte
0

string createfolder = "E: / tmp /" + uId;
System.IO.Directory.CreateDirectory (createfolder);

amit
fonte
0

Use este código se a pasta não for apresentada na pasta de imagem ou em outras pastas

 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");
Jogi
fonte
-1

Uma maneira elegante é estender o FileUpload o método desejado.

Adicione isso:

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

Então use-o:

FileUpload file;
...
file.SaveAs(path,true);
MiguelSlv
fonte
-3
string root = @"C:\Temp";

string subdir = @"C:\Temp\Mahesh";

// If directory does not exist, create it.

if (!Directory.Exists(root))
{

Directory.CreateDirectory(root);

}

O CreateDirectory também é usado para criar um subdiretório. Tudo o que você precisa fazer é especificar o caminho do diretório no qual esse subdiretório será criado. O seguinte trecho de código cria um subdiretório Mahesh C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}
uksp
fonte
-5

Derivado / combinado de várias respostas, implementá-lo para mim foi tão fácil quanto isto:

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

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}
B. Clay Shannon
fonte
6
Qual é o sentido de encapsular um método no que é essencialmente uma cópia exata, com apenas um nome ligeiramente diferente? Você literalmente não ganha nada com isso.
Krythic