2010-02-08 61 views
15

Obtengo datos binarios de un campo de base de datos de SQL Server y estoy creando un documento localmente en un directorio en el que mi aplicación tiene permisos. Sin embargo, sigo obteniendo el error especificado en el título. He intentado numerosas sugerencias publicadas en la web, incluidas las sugeridas en publicaciones anteriores sobre Stackoverflow. También he usado ProcessExplorer> Find Handle para localizar el bloqueo y no devuelve nada como si el archivo no estuviera bloqueado.El proceso no puede acceder al archivo porque lo está utilizando otro proceso

Estoy utilizando el siguiente código para guardar el archivo en el sistema de archivos y luego trato de copiar este archivo a una nueva ubicación más adelante en el proceso de solicitud dentro de otro método. Es este método de copia el que toma la ruta del archivo recién creado que arroja la excepción.

El archivo en sí se crea con su contenido y puedo abrirlo a través del Explorador de Windows sin ningún problema.

¿Me falta algo completamente obvio? ¿Estoy creando el archivo correctamente desde la base de datos? Cualquier ayuda para resolver o diagnosticar mejor el problema sería muy apreciada.

// Get file from DB 
FileStream fs = new FileStream(
    "C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write); 
BinaryWriter br = new BinaryWriter(fs); 
br.Write("BinaryDataFromDB"); 
fs.Flush(); 
fs.Close(); 
fs.Dispose(); 

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 
+0

¿Publicará el código real? Parece que hay un problema invisible que probablemente yace escondido en otra parte ... – Bloodyaugust

+0

Sé que probablemente solo hiciste un reemplazo de texto para los fines de tu pregunta, pero tu ruta de archivo debería ser '@" C: \ myTempDirectory \ myFile.doc "' debido a la barra invertida que escapa. – Jacob

+0

¿Estás seguro de que la excepción no está hablando de que el nombre de archivo de destino esté siendo utilizado por otro proceso? – Jacob

Respuesta

28

Trate de añadir una llamada a GC.Collect() después de haber dispuesto de sus flujos de fuerce al recolector de basura a limpiar.

// Get file from DB 
using(FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
using(BinaryWriter br = new BinaryWriter(fs)) 
{ 
    br.Write("BinaryDataFromDB"); 
    fs.Flush(); 
} 

//Force clean up 
GC.Collect(); 

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 
+0

Muchas gracias, parece haberlo hecho. Sin embargo, algo debe estar mal en algún lugar para que aún lo conserve incluso después de haber llamado close(). Bueno, al menos puedo pasar a la siguiente fase del problema.Muchas gracias a todos los que me ayudaron a llegar al fondo, muy apreciado. Dormiré profundamente esta noche :) – Cragly

+12

¿Alguien puede explicar por qué las transmisiones no se cierran inmediatamente en Dispose()? – Kugel

+5

GC.Collect() => ¡eso es MALVADO! – user384080

1

¿Es que Filestream y BinaryWriter no se pueden usar al mismo tiempo? Por ejemplo, un streamwriter y un streamreader no pueden ser llamados en el mismo archivo. Sin embargo, esto no tiene sentido, hasta donde yo sé, no debería ser en este caso. Tal vez intente cerrar br también?

1

Pruebe desechar su objeto BinaryWriter antes de hacer la copia.

+0

No hay suerte chicos. Hice un Flush() y un Close() en el BinaryWriter y todavía recibo el mismo error. – Cragly

+0

¿Qué tal un Dispose? –

1

¿Hay algún proceso en segundo plano como antivirus o indexación del sistema de archivos que bloquee el archivo el tiempo suficiente para causar problemas con la aplicación? Intenta hacer una pausa de 3 segundos para ver si tu problema desaparece.

using System.Threading; 

fs.Dispose(); 
Thread.Sleep(3000); 
// Copy file 
+0

¡No! justo lo mismo que está sucediendo. Empezando a volverme loco ahora ... – Cragly

3

¿Qué hay de using?

string source = @"C:\myTempDirectory\myFile.doc"; 
using(FileStream fs = new FileStream(
    source, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read)) 
{ 
    BinaryWriter br = new BinaryWriter(fs); 
    br.Write("BinaryDataFromDB"); 
} 

File.Copy(sourceFileName, destinationFilename, true); 

EDITAR: Trata de informar a un permiso FileShare.Read.

+0

¿Qué hay de usar en ese BinaryWriter? –

+0

No trabajo tengo miedo. Incluso lo intenté con y sin Close() en FileStream y BinaryWriter. – Cragly

+1

Añadiendo el 'FileShare.Read' * parece * haber solucionado el problema * para mí * –

4

cambiar el código de la siguiente manera, el problema es que el del filestream no se recoge la basura cuando lo necesita:

// Get file from DB 
using (FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
{ 
    BinaryWriter br = new BinaryWriter(fs); 
    br.Write("BinaryDataFromDB"); 
    fs.Flush(); 
    fs.Close(); 
} 

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 
+0

¡No hay nada de desafortunado! Debería ser algo tan simple de hacer. Gracias de nuevo por todos sus esfuerzos chicos es muy apreciado. – Cragly

3

llegué a entender que aunque el depurador de error dice que el error está en el código .. Pero eso no es donde está el error .. me enfrentaba a un problema similar y me encontré con esta solución. . considerar todos los puestos de arriba .. puede ser que puede ayudar a alguien ..


que utilizó la imagen para mostrarla en un cuadro de imagen después de retreiving de base de datos y guardarlo como "temp.bmp" utilizando la codificación normal sin utilizar el 'uso' de palabras clave que utiliza este código al principio:

PictureBox1.Image = Image.FromFile("temp.bmp"); 

la cual se puso y error y realmente no tiene cabeza y la cola del error .. y por eso subió con esta solución


en lugar de asignar que tratar directamente este código:.

Bitmap img; 
using (Bitmap bmp = new Bitmap("temp.bmp")) 
{ 
    img = new Bitmap(bmp); 
} 
pictureBox1.Image = img; 

venir al archivo parte de flujo continuo que acabo de utilizar código normal de la siguiente manera:

FileStream fs = new FileStream("filepath",FileMode.Create); 

y funcionó como un pedazo de la torta


Realmente ayudó

+0

Gracias Murali. Puedo ver cómo funcionaría asignando el valor a un nuevo objeto y luego asignando ese valor a los objetos que no forma parte de la instrucción using. Gracias por la actualización y, con suerte, será útil para otras personas que se encuentren con el mismo problema. – Cragly

0

Esto fue lo que hice:

Stream stream = new MemoryStream(); 
var tempStream = new FileStream(pathToFile, FileMode.Open); 
tempStream.CopyTo(stream); 
tempStream.Close(); 

luego use el objeto stream donde quiera.

-1

Parece que me encuentro con esto solo después de haber publicado una aplicación. Si cierra el cuadro de mensaje y vuelve a intentar la depuración, no pasará nada. MS Help dice que debe salir de Visual Studio y reiniciarlo. Es más fácil abrir el Administrador de tareas y finalizar el proceso. Su nombre será el nombre de la solución seguido de ".vshost" (por ejemplo, nombre del proyecto: PLC.sln; nombre del proceso: PLC.vshost.exe). El proceso se reiniciará automáticamente. En Windows 7, por lo general, uno puede ver que sucede algo al finalizar un proceso. Pero en 10, la ventana Administrador de tareas rara vez cambia. Aparece este mensaje cuando intento probar un programa después de cambiar el código. Aparentemente, el .exe no se cierra cuando uno detiene la depuración y se produce el error cuando VS intenta escribir un archivo exe recién compilado. A veces tengo que finalizar el proceso dos veces para evitar que vuelva el mensaje de error. (Tengo que encontrarme con el error dos veces, finalizar el proceso dos veces y luego volver a ejecutarlo no ayuda.) Este es un error en Visual Studio.

+0

Intenta formatear tu respuesta. es difícil leer un párrafo tan grande de texto – martianwars

Cuestiones relacionadas