File.Delete = IOException (archivo aún en uso por otro proceso)

Tengo un pequeño problema con mi aplicación. Con mi aplicación, quiero descargar algunos archivos a través de webclient.DownloadFileAsync y, en caso de que el usuario cierre el programa mientras se está ejecutando una descarga, quiero cancelar ese proceso de cliente web y eliminar el archivo también.

Ya lo probé con el siguiente código, pero no funciona del todo ya que siempre obtengo una IOException (archivo en uso por otro proceso).

            for (z = 0; z < CheckedCount; z++)
        {
            MultiWebclient[z].CancelAsync();
            MultiWebclient[z].Dispose();

            dgvDownloads.Rows[z].Cells[5].Value = "Canceled";
            File.Delete(selectedFolder + _downloadRowNameList[z] + ".mp4");
        }

preguntado el 04 de julio de 12 a las 03:07

@mydogisbox, según la excepción, supongo que es la llamada File.Delete. -

@AndreCalil De alguna manera mi cerebro filtró esa parte jajaja -

@f4bzen, ¿está seguro de que CancelAsync finalizó el proceso? Tal vez esa llamada Dispose no cambie nada.

@f4bzen, ¿ha intentado llamar a Dispose (verdadero)? Consulte el documento en MSDN: msdn.microsoft.com/en-us/library/d9yzd5cx.aspx -

Preste atención a la palabra "async" en CancelAsync(). Eso significa que no se cancelará inmediatamente. Debe eliminar el archivo en el controlador de eventos completado. -

3 Respuestas

Los archivos de descarga se adjuntan con la rutina de descarga y cuando intenta eliminar estos archivos, obtiene el error. Hay pocas cosas que puedes probar.

  1. Use el temporizador para verificar repetidamente si la rutina de descarga libera los identificadores de archivos, puede verificar después de 30 segundos. De esta manera, podrá eliminar archivos tan pronto como se suelte el identificador mediante la rutina de descarga.

  2. Puede almacenar rutas/nombres de archivo de los archivos para eliminar cuando el usuario cancela la operación y eliminar archivos en el próximo inicio de la aplicación.

Respondido 04 Jul 12, 03:07

Su MultiWebClient probablemente todavía tenga el archivo abierto en una secuencia. ¿Qué hace realmente ese método Dispose? Supongo que también es posible que el método Dispose pueda hacer algún trabajo de forma asincrónica y su flujo aún esté abierto cuando llegue a ese archivo. La conclusión es que algo en alguna parte tiene ese archivo y el gran sospechoso es ese MultiWebClient.

Respondido 04 Jul 12, 03:07

No estoy seguro de si esta es una solución legítima, pero logré resolver mi problema cancelando el cliente web (webclient.CancelAsync();) con un botón adicional y poniendo File.Delete(); dentro de una declaración if(e.Cancelled) que se activará en el evento DownloadFileCompleted.

Respondido 05 Jul 12, 02:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.