2009-05-01 158 views
5

Tengo un problema cuando intento eliminar un archivo de imagen. Siempre aparece un error que dice: IOExeption no se ha manejado. Acceso denegado porque el archivo está siendo usado por otro proceso.C# File.Delete, archivo que está siendo utilizado por otro proceso

No sé qué proceso podría ser y cómo solucionarlo.

private void comboBox3_SelectedIndexChanged(object sender, EventArgs e) 
     {    
      Album album = GetAlbum(comboBox1.SelectedIndex); 
      Photo photo = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex);   

      txtPhotoPath.Text = Directory.GetCurrentDirectory() + "\\" + photo.SPath; 

      lblExtention.Text = photo.SExtention; 
      txtPhotoTitle.Text = photo.STitle; 
      pctrbFoto.Image = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr()); 
     } 

private void btnChangePhoto_Click(object sender, EventArgs e) 
{ 
      Album album = GetAlbum(comboBox1.SelectedIndex); 
      Photo photo = GetPhoto(comboBox1.SelectedIndex, comboBox3.SelectedIndex); 

      File.Delete("Albums\\Images\\" + photo.STitle + foto.SExtention); 

      photo.SExtention = lblExtention.Text; 
      photo.STitle = txtPhotoTitel.Text; 
      Photo.SPath = txtPath.Text; 

      File.Copy(photo.SPath, "Albums\\Images\\" + photo.STitle + photo.SExtention); 

}

Gracias, Vinzcent


Gracias a todos por la ayuda.

He utilizado este y funciona muy bien ahora


su proceso es el que utiliza el archivo, es necesario configurar la imagen para anular el uso algo como esto:

var img = Imagen. FromFile (foto.SPath) .GetThumbnailImage (GetWitdth (foto.SPath, GetHeight (foto.SPath, 150)), GetfHeight (foto.SPath, 150), nulo, nuevo IntPtr());

pctrbFoto.Image = img;

img = null;

GC.Collect();

Respuesta

2

su proceso es el que utiliza el archivo, es necesario configurar la imagen para anular uso algo como esto:

using(var img = Image.FromFile(foto.SPath).GetThumbnailImage(GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), GetfHeight(photo.SPath, 150), null, new IntPtr())) 
    pctrbFoto.Image = img; 
+6

En general, es una mala idea llamar a GC.Collect: http://blogs.msdn.com/ricom/archive/2004/11/29/271829.aspx Dado que la imagen implementa IDisposable, debe llamar a img.Dispose() en su lugar, o (preferiblemente) usar un bloque "using". –

+1

sí u r derecho;) – Sadegh

6

La primera área que buscaría es en su método GetPhoto. ¿Tienes un StreamReader que no ha sido cerrado? Asegúrese de que si está haciendo algún tipo de E/S en el archivo antes de la eliminación, cierre esas conexiones primero. ¿Qué hace el método GetPhoto()?

3

Primero debe determinar si es su aplicación u otra aplicación que tenga el archivo abierto.

Puede usar Process Explorer de Mark Russinovich para ver qué programa tiene un archivo o directorio en particular abierto. Es parte de la línea de utilidades excelentes de Windows Sysinternals que todo programador/profesional de TI debe usar (o al menos tener en cuenta).

Puede obtenerlo aquí: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx

+0

Estoy de acuerdo. Pero no veo las opciones para mostrar los archivos que los programas están usando. – TamusJRoyce

0

se puede utilizar el programa Unlocker para decirle qué programa (s) tiene el archivo bloqueado

Nota: eliminó el enlace con el programa Unlocker - contiene software malicioso.

+0

También puede usar Process Explorer para indicarle qué programas tienen un archivo bloqueado (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx) – Brian

+0

Solo como una nota, el software de Unlocker no No contiene software malicioso ... –

2

Cuando se llama a Image.FromFile en comboBox3_SelectedIndexChanged, y quizás también en otros lugares, que no deseche el objeto Image. Por lo tanto, su programa mantiene el archivo en uso.

Debe deshacerse de la imagen cada vez que la abra.

1

Cuando falla todo lo demás, puede usar MoveFileEx para eliminar el archivo en el próximo reinicio.

3

donde está recibiendo el uso de miniaturas:

using(Image img = Image.FromFile(foto.SPath)) 
{ 
    pctrbPhoto. Image = img.GetThumbnailImage(
    GetWitdth(photo.SPath, GetHeight(photo.SPath, 150)), 
    GetfHeight(photo.SPath, 150), null, new IntPtr()); 
} 

lugar para asegurarse de que la imagen de origen está dispuesto (cerrado) cuando haya terminado con él.

De esta manera, la imagen que se carga desde el archivo se queda hasta que el recolector de basura decide liberarla, lo que podría llevar un tiempo.

Las imágenes cargadas con FromFile mantienen abierto el archivo que se cargaron.

0

... pero, si la aplicación se ejecuta en un plan de alojamiento web? No puede ejecutar ningún software en un servidor compartido.

He intentado con dispose() y otras opciones, pero no puedo eliminar archivos como Vinzcent.

Maldito IIS: @

Cuestiones relacionadas