Si no existe una carpeta, créela

720

Yo uso un control FileUploader en mi aplicación. Quiero guardar un archivo en una carpeta especificada. Ahora quiero, si esta carpeta no existe, crearla primero y luego guardar mi archivo en esta carpeta. Si la carpeta ya existe, simplemente guarde el archivo en ella.

¿Como puedo hacer esto?

Tavousi
fuente
@JoeBlow - Ha - debería haber especificado qué respuesta es incorrecta; ahora la página es aún más confusa. (¿Cambió la respuesta aceptada o no? ¡Dios mío!) ;-)
Bartosz
Terminé aquí mientras buscaba otras cosas, pero es sorprendente cuántas personas están luchando para contradecirse entre sí con su propia versión de la misma historia. Microsoft creó el .NET Framework y el MSDN. Si el comportamiento correcto es respetado por otros implementadores, como Mono, es irrelevante para la corrección del comportamiento descrito en MSDN. Ah, y Mono hace lo correcto también, entonces, ¿dónde está el argumento?
monkey0506

Respuestas:

1239

Como otros han dicho, use System.IO.Directory.CreateDirectory

Pero, no es necesario verificar si existe primero. De los documentos

Se crean todos los directorios especificados en la ruta, a menos que ya existan o que alguna parte de la ruta no sea válida. Si el directorio ya existe, este método no crea un nuevo directorio, pero devuelve un objeto DirectoryInfo para el directorio existente.

Mark Peters
fuente
25
Sin embargo, el ejemplo de Microsoft código en sí mismo contradice comprobando si existe el directorio primera ...
eCoE
1
¿Entonces tenemos que verificar si existe o no? Si verificamos y luego también verificamos el método CreateDirectory nuevamente, hacemos la verificación dos veces ... y el funcionamiento del sistema de archivos AFAIK es costoso
Giox
3
@Muflix así: cree un archivo, por ejemplo, "FILENAME" en un directorio, pero no le dé ninguna extensión. Luego intente llamar a Directory.Exists ("FILENAME") devolverá false, como debería porque no existe dicho directorio. Ahora, si llama a CreateDirectory ("FILENAME"), fallará miserablemente como debería porque ya hay "algo" con ese nombre allí. Espero que tenga sentido.
Otávio Décio
1
¡INCORRECTO! DEBE verificar si la carpeta existe. Acabo de identificar que este método tiene un problema grave. Si no verifica la existencia de la carpeta, el identificador de carpeta se filtrará a menos que lo libere específicamente. Utilizamos este ejemplo en una aplicación que procesa millones de carpetas. Cada vez que se llamó a este método, la aplicación retuvo el identificador de archivo en el directorio. Después de varias horas, el NAS de red corporativa tenía millones de identificadores de archivos abiertos en las carpetas. La actualización para incluir el cheque es gratis
soddoff Baldrick
356

Utilice el siguiente código según 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
fuente
41
Por qué no: if (! Directory.Exists (path_to_check)) Directory.CreateDirectory (path_to_check);
Dayan
159
No es necesario verificar si existe la carpeta. Lea el manual cuidadosamente.
bazzilic
30
Verificar y crear no es atómico. El código anterior huele, hay una condición de carrera. Es mejor que cree incondicionalmente el directorio y capture una FileExistsexcepción (o lo que sea el equivalente de C #) en caso de que la función esté diseñada para lanzar uno.
Jo So
66
Como otros han señalado, no hay necesidad de llamar a Exists y realmente crea una nueva condición de falla.
Ed S.
3
@ MartininSmith: Entonces simplemente cree el directorio. No verifique la existencia antes. Eso no es solo más corto. Tampoco da una falsa impresión de cuál es la API de System.IO.Directory.CreateDirectory. (Y es más rápido, pero probablemente eso no importa)
Jo So
224

Solo escribe esta línea:

System.IO.Directory.CreateDirectory("my folder");
  • Si la carpeta aún no existe , se creará .
  • Si la carpeta ya existe , la línea será ignorada .

Referencia: artículo sobre Directory.CreateDirectory en MSDN

Por supuesto, también puede escribir using System.IO;en la parte superior del archivo fuente y luego simplemente escribir Directory.CreateDirectory("my folder");cada vez que desee crear una carpeta.

Nicolas Raoul
fuente
28

Directory.CreateDirectory Explica cómo probar y crear FilePath si no existe

Directory.ExistsExplica cómo verificar si existe un FilePath. Sin embargo, no necesita esto ya que CreateDirectory lo comprobará por usted.

jeroenh
fuente
@Tavousi estas funciones proporcionadas por jeroenh serían un buen comienzo;)
Allan Chua
ninguno de los enlaces de documentación de msdn parece estar funcionando en este momento, incluso a través de la búsqueda de msdn ...
jeroenh
los enlaces están bien ahora
Anand
Esto permite condiciones de carrera, ver la respuesta aceptada .
ComFreek
27

Puede crear la ruta si aún no existe con un método como el siguiente:

using System.IO;

private void CreateIfMissing(string path)
{
  bool folderExists = Directory.Exists(Server.MapPath(path));
  if (!folderExists)
    Directory.CreateDirectory(Server.MapPath(path));
}
Dennis Traub
fuente
66
El cheque if (!folderExists)no es necesario.
bazzilic
8
@bazzilic sí, pero revela la intención. No tengo que adivinar (o saber con certeza) cómo la API maneja esto. Cualquiera que lea este código sabrá con certeza lo que sucederá.
Dennis Traub
44
En entornos multiproceso (como el estado de un sistema de archivos), solo tiene la opción de bloquear o probar y atrapar. El fragmento de arriba tiene una condición de carrera. La función podría generar una FileExistsexcepción (o como se llame en C #)
Jo So
99
"revela intención" - Esta no es una buena justificación. Podrías escribir un comentario en el código.
Jim Balter
15

Este método creará una carpeta si no existe y no hará nada si existe

Directory.CreateDirectory(path);
Roca Thakur
fuente
15

Puede usar una cláusula try / catch y verificar si existe:

  try
  {
    if (!Directory.Exists(path))
    {
       // Try to create the directory.
       DirectoryInfo di = Directory.CreateDirectory(path);
    }
  }
  catch (IOException ioex)
  {
     Console.WriteLine(ioex.Message);
  }
Hombre de método
fuente
8
Esta es una buena respuesta, pero, de acuerdo con la documentación de MSDN, "se crean todos los directorios especificados en la ruta, a menos que ya existan o que alguna parte de la ruta no sea válida. El parámetro de ruta especifica una ruta de directorio, no una ruta de archivo . Si el directorio ya existe, este método no hace nada ". Por lo tanto, realmente no necesita la llamada a Directory.Exists (ruta).
Ken
2
Eso es cierto, pero eso es también un assumtion así que siempre es mejor consultar en lugar de asumir independientemente de lo que dice MSDN ..
MethodMan
66
@DJ KRAZE, creo que MSDN a menos que se haya demostrado que está equivocado. Recomienda lo contrario: ignore lo que dice MSDN y agregue controles adicionales (innecesarios) en su código. ¿Dónde se traza la línea?
Polyfun
1
ShellShock en ninguna parte digo ignorar ... esta es una afirmación perspicaz que digo es mejor no asumir que asumir ... lea lo que he dicho una vez más ... gracias
MethodMan
3
@DJKRAZE nadie está asumiendo nada. Está escrito en inglés simple en el manual que la verificación no es necesaria.
bazzilic
14
using System.IO

if (!Directory.Exists(yourDirectory))
    Directory.CreateDirectory(yourDirectory);
Oso negro
fuente
12
if (!Directory.Exists(Path.GetDirectoryName(fileName)))
{
    Directory.CreateDirectory(Path.GetDirectoryName(fileName));
}
Kiran Solkar
fuente
3
CreateDirectory ya maneja la comprobación si el directorio no existe.
bergmeister
6

El siguiente código es la mejor línea (s) de código que uso que creará el directorio si no está presente.

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

Si el directorio ya existe, este método no crea un nuevo directorio, pero devuelve un objeto DirectoryInfo para el directorio existente. >

UJS
fuente
CreateDirectory ya maneja la comprobación si el directorio no existe.
bergmeister
@bergmeister, gracias. Acabo de cruzar comprobado. Realmente eliminó el cheque condicional. ¡Actualizado!
UJS
5

Crear nueva carpeta, dada la ruta de una carpeta principal:

        string pathToNewFolder = System.IO.Path.Combine(parentFolderPath, "NewSubFolder");
        DirectoryInfo directory = Directory.CreateDirectory(pathToNewFolder); 
       // Will create if does not already exist (otherwise will ignore)
  • ruta a la nueva carpeta dada
  • variable de información de directorio para que pueda continuar manipulándola como desee.
BKSpurgeon
fuente
0

Use el siguiente código. Usé este código para copiar archivos y crear una nueva carpeta.

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
fuente
0

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

amit
fuente
0

Use este código si la carpeta no se presenta en la carpeta de imágenes u otras carpetas

 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
fuente
-1

Una forma elegante es extender el FileUpload el método con el que desea.

Agrega esto:

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

Entonces úsalo:

FileUpload file;
...
file.SaveAs(path,true);
MiguelSlv
fuente
-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 también se utiliza para crear un subdirectorio. Todo lo que tiene que hacer es especificar la ruta del directorio en el que se creará este subdirectorio. El siguiente fragmento de código crea un subdirectorio Mahesh en C:\Temp directory.

// Create sub directory

if (!Directory.Exists(subdir))
{

Directory.CreateDirectory(subdir);

}
uksp
fuente
-5

Derivado / combinado de múltiples respuestas, implementarlo para mí fue tan fácil como esto:

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

private void CreateDirectoryIfDoesNotExist(string dirName)
{
    System.IO.Directory.CreateDirectory(dirName);
}
B. Clay Shannon
fuente
66
¿Cuál es el punto de encapsular un método en lo que es esencialmente una copia exacta, con solo un nombre ligeramente diferente? Literalmente no ganas nada de esto.
Krythic