Estoy tratando de detectar si existe un archivo en tiempo de ejecución, si no, créelo. Sin embargo, recibo este error cuando intento escribir en él:
El proceso no puede acceder al archivo 'myfile.ext' porque está siendo utilizado por otro proceso.
string filePath = string.Format(@"{0}\M{1}.dat", ConfigurationManager.AppSettings["DirectoryPath"], costCentre);
if (!File.Exists(filePath))
{
File.Create(filePath);
}
using (StreamWriter sw = File.AppendText(filePath))
{
//write my text
}
¿Alguna idea de cómo arreglarlo?
File.Create()
método! ¡El fragmento de arriba ya crea el archivo!Quiero actualizar esta respuesta para decir que esta no es realmente la forma más eficiente de escribir todo el texto. Solo debe usar este código si necesita algo rápido y sucio.
Yo era un programador joven cuando respondí a esta pregunta, y en ese entonces pensé que era una especie de genio para dar con esta respuesta.
fuente
FileStream(string, FileMode)
constructor y pasarlo FileMode.Create , que sobrescribirá cualquier archivo existente. Todavía no es necesario abrir el archivo dos veces. Además, esta respuesta se editó después de que publiqué mi comentario original..Close()
al final, por lo que funciona en cualquier caso. Desconfío del sistema de usoFileStream
para todo porque no quiero que ocurra la excepción en el caso deFileMode.Create
que el archivo ya esté allí, especialmente cuando quiero borrar el contenido y no agregarloFileMode.Open
. Para mí,FileStream
solo funciona realmente después de deshacerse del archivo en cuestión y luego escribir en él. Dado queFile.Create
lo deja abierto y bloqueado, parece que agregarlo.Close()
es la única forma real de lidiar con mi escenario y SO.Al crear un archivo de texto, puede utilizar el siguiente código:
Usando el código de tu comentario. El archivo (flujo) que creó debe estar cerrado. File.Create devuelve el flujo de archivos al archivo recién creado:
fuente
File.Create
regresaFileStream
y eso tieneClose()
fuente
File.Create devuelve un FileStream. Debe cerrar eso cuando haya escrito en el archivo:
Puede utilizar using para cerrar automáticamente el archivo.
fuente
StreamWriter
como se puede inferir de su uso deFile.AppendText
.Actualicé su pregunta con el fragmento de código. Después de una sangría adecuada, queda inmediatamente claro cuál es el problema: usa
File.Create()
pero no cierra elFileStream
que devuelve.Hacerlo de esa manera es innecesario,
StreamWriter
ya permite agregar a un archivo existente y crear un nuevo archivo si aún no existe. Me gusta esto:Que usa este
StreamWriter
constructor .fuente
Esta pregunta ya ha sido respondida, pero aquí hay una solución del mundo real que verifica si el directorio existe y agrega un número al final si existe el archivo de texto. Utilizo esto para crear archivos de registro diarios en un servicio de Windows que escribí. Espero que esto ayude a alguien.
fuente
Sé que esta es una pregunta antigua, pero solo quiero lanzar esto para que aún puedas usarlo
File.Create("filename")"
, solo agregarlo.Dispose()
.File.Create("filename").Dispose();
De esta forma crea y cierra el archivo para que el próximo proceso lo utilice.
fuente
File.Create(FilePath).Close();
de la respuesta anterior tienethis.Dispose(true); GC.SuppressFinalize((object) this);
en su implementación.Creo que conozco el motivo de esta excepción. Es posible que esté ejecutando este fragmento de código en varios subprocesos.
fuente
Prueba esto: funciona en cualquier caso, si el archivo no existe, lo creará y luego escribirá en él. Y si ya existe, no hay problema, se abrirá y escribirá en él:
fuente