¿Cuál es la forma más simple / canónica de crear un archivo vacío en C # /. NET?
La forma más simple que pude encontrar hasta ahora es:
System.IO.File.WriteAllLines(filename, new string[0]);
Usar solo File.Create
dejará el archivo abierto, lo que probablemente no sea lo que desea.
Podrías usar:
using (File.Create(filename)) ;
Eso parece un poco extraño, eso sí. Podrías usar llaves en su lugar:
using (File.Create(filename)) {}
O simplemente llame Dispose
directamente:
File.Create(filename).Dispose();
De cualquier manera, si va a usar esto en más de un lugar, probablemente debería considerar envolverlo en un método auxiliar, p. Ej.
public static void CreateEmptyFile(string filename)
{
File.Create(filename).Dispose();
}
Tenga en cuenta que llamar Dispose
directamente en lugar de usar una using
declaración realmente no hace mucha diferencia aquí hasta donde puedo decir: la única forma en que podría hacer una diferencia es si el hilo se cancelara entre la llamada File.Create
y la llamada a Dispose
. Si existe esa condición de carrera, sospecho que también existiría en la using
versión, si el hilo se abortara al final del File.Create
método, justo antes de que se devolviera el valor ...
using (File.Create(filename)) ;
, pero me encanta la simplicidad deFile.Create(filename).Dispose();
File.Create(filename).Dispose();
lugar de.Close()
también liberará los recursos.Close()
solo llamadasDispose
- vea github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/…using (new FileStream(filename, FileMode.CreateNew)) { }
o
fuente
File.WriteAllText(string, string)
usa "codificación UTF-8 sin una marca de orden de bytes (BOM)" . Si aún ve uno, sería un error en WriteAllText o en su documentación que vale la pena informar.Encoding.UTF8
devuelve un codificador que genera la marca de orden de bytes (BOM). Puede usarnew UTF8Encoding(false)
para obtener un codificador UTF8 que no genera la lista de materiales.WriteAllText
realmente se comporta diferente en la versión anterior de .NET. Sin embargo, para estar más seguro, simplemente omita la parte de codificación y úselaFile.WriteAllBytes(path, new byte[] { });
en su lugar.Como otros han señalado, debe deshacerse de este objeto o envolverlo en una declaración de uso vacía.
fuente
Para evitar sobrescribir accidentalmente un archivo existente, use:
... y maneje la IOException que ocurrirá si el archivo ya existe.
File.Create
, que se sugiere en otras respuestas, sobrescribirá el contenido del archivo si ya existe. En casos simples, puede mitigar esto usandoFile.Exists()
. Sin embargo, es necesario algo más robusto en escenarios en los que múltiples hilos y / o procesos intentan crear archivos en la misma carpeta simultáneamente.fuente
Puede encadenar métodos del objeto devuelto, por lo que puede cerrar inmediatamente el archivo que acaba de abrir en una sola declaración.
fuente
Un caso de uso algo común para crear un archivo vacío es desencadenar que algo más suceda en un proceso diferente en ausencia de una comunicación de proceso más sofisticada. En este caso, puede ayudar que la creación del archivo sea atómica desde el punto de vista del mundo exterior (particularmente si lo que se dispara va a eliminar el archivo para "consumir" el disparador).
Por lo tanto, puede ayudar crear un nombre basura (Guid.NewGuid.ToString ()) en el mismo directorio que el archivo que desea crear, y luego hacer un File.Move desde el nombre temporal hasta el nombre deseado. De lo contrario, el código activado que verifica la existencia del archivo y luego elimina el disparador puede encontrarse en condiciones de carrera donde el archivo se elimina antes de que se cierre por completo.
Tener el archivo temporal en el mismo directorio (y sistema de archivos) le brinda la atomicidad que desee. Esto da algo así.
fuente
Path.GetTempFileName () creará un archivo vacío con un nombre único y le devolverá la ruta.
Si desea controlar la ruta pero obtiene un nombre de archivo aleatorio, puede usar GetRandomFileName para devolver una cadena de nombre de archivo y usarla con Crear
Por ejemplo:
fuente