2012-06-06 9 views
5

Quiero crear un archivo que está en un directorio específico. Por ejemplo: C: \ x \ y \ z \ a.txt¿Cómo crear un archivo y sus directorios principales en una llamada a un método?

Para esta operación, tengo que crear el directorio para crear el archivo.

Directory.Createdirectory("C:\x\y\z\"); 
File.Create("C:\x\y\z\a.txt"); 

Pero realmente me pregunto si puedo hacer esta operación en una sola línea de código.

Cualquier ayuda e idea será muy apreciada.

+2

¿Por qué es tan importante reducir esto a uno usando un método específico de .Net framework? –

Respuesta

2

Hasta donde sé, no existe un método de creación de archivos que cree el directorio al mismo tiempo en .NET Framework.

Si el patrón "Verificación/creación de directorios, luego creación de archivos" se repite mucho en su código, debe implementarlo en un método.

2

simple: Añadir una función

void MySingleLineOfCodeFunction(string path, string filename) 
{ 
    Directory.Createdirectory(path); 
    File.Create(filename); 
} 

y luego usar una sola línea de código:

MySingleLineOfCodeFunction(@"C:\x\y\z\", "a.txt"); 

Lo que estoy tratando de decir es que no hay diferencia entre el código. Parte de esto está escrito por los chicos de Microsoft, mientras que otros por nosotros, gente normal. Pero las computadoras no hacen la diferencia. :)

+0

Tengo un método como este pero quiero reducir estas dos líneas de código a una sola línea si es posible – ibrahimyilmaz

+2

Lo redujo a una sola línea, combinándolo en un método. No hay diferencia entre su método que llama a esas dos llamadas API y alguna función de Microsoft que llama a las dos llamadas API. Aún DEBE hacer dos llamadas, una para el directorio y otra para el archivo. –

+0

Creo que hay una manera de hacer esto con C# incorporado, pero no hay manera np :) – ibrahimyilmaz

2

Lamentablemente, no existe una sola línea de código para hacer lo que desee.

¿Por qué? Porque incluso si lo hacemos mediante alguna función incorporada de Microsoft, internamente llamaremos a dos métodos. Uno para la creación de directorios y otro para la creación de archivos.

Sin embargo, usted puede reducir sus líneas de código, haciéndolos a un método y llamarlo en una sola línea como Petar Ivanov dijo

O

Se puede crear un método de extensión estática. De esta forma, puede usarlo en otros lugares sin crear una instancia. (Se reduce la línea donde se crea la instancia).

+0

Como File es un tipo estático, no podrá crear métodos de extensión para File. –

1

Para crear un archivo, no, el directorio debe existir. Incluso con las clases amigables con archivos de Visual Basic, aún debe crear los directorios primero. Lo que es interesante es que mover creará la carpeta.

De CreateFile http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx

Directorios

una aplicación no puede crear un directorio utilizando CreateFile, por lo tanto, sólo el valor OPEN_EXISTING es válida para dwCreationDisposition para este caso de uso. Para crear un directorio, la aplicación debe llamar CreateDirectory o CreateDirectoryEx

+0

+1. Me lo ganaste :) Esto no es una limitación del .NET framework, pero es una limitación de la API de Win32. –

0

He modificado la respuesta de @Petar_Ivanov, para calcular el directorio padre en base a la ruta del archivo, pensó que puede ser útil para otras personas que puedan quiero una función similar.

public void CreateFile(string filePath) 
    { 
     if (!File.Exists(filePath)) 
     { 
      var parent = Directory.GetParent(filePath); 
      Directory.CreateDirectory(parent.FullName); 
      File.Create(filePath); 
     } 
    } 

La advertencia principal con este enfoque es que; File.Create devuelve una secuencia de archivos, por lo que debe recordar cerrarla.

0

Principalmente en mis bloques de código; Manejo la existencia de carpetas justo antes de crear partes.

public void CheckCreatePath(fileName) 
{ 
    string filePath = Directory.GetParent(fileName).ToString(); 
    if (!Directory.Exists(filePath)) 
     Directory.CreateDirectory(filePath); 
} 

y sólo tiene que utilizar

CheckCreatePath("C:\\TEMP\\TESTPath\\myFile.txt"); 

en su bloque de código.

Cuestiones relacionadas