Pregunta


Tengo una aplicación (WinForms) que descarga un archivo a la carpeta temporal del usuario, luego abre el archivo para que el usuario vea el contenido, y cuando el archivo está cerrado, el archivo se elimina de la carpeta TEMP. La aplicación funciona bien si abro, digamos uno .pdf y otro .doc El problema aparece cuando intenta abrir uno .doc si otro proceso de Winword todavía está ejecutando (no importa si mi aplicación abre o directamente por el usuario) .

Estoy usando el siguiente código:

_OpenFileProces = System.Diagnostics.Process.Start(TempFileName);
_OpenFileProces.EnableRaisingEvents = true;
_OpenFileProces.Exited += new EventHandler(_OpenFileProces_Exited);

y este para limpiar la temperatura

void _OpenFileProces_Exited(object sender, EventArgs e)
    {
        string s = ((System.Diagnostics.Process)sender).StartInfo.FileName;
        System.IO.File.Delete(s);
    }

Parece que el proceso de ejecución está deteniendo el mío ... y debido a que detenerlo eliminará el archivo o generará un error al intentar eliminar el archivo.
¿Tiene alguna sugerencia cómo puedo abrir mi propio proceso? La cuestión es que no sé qué tipo de archivo tengo que abrir (podría ser cualquier cosa) y cuento en Windows para elegir la mejor aplicación. Desde mi prueba, el bloc de notas funciona bien, pero Winword y Acrobat cierran mi proceso.
Gracias

¿Fue útil?

Solución

Sospecho que Microsoft Word está haciendo exactamente lo mismo aquí que Raymond Chen describe el shell de Windows como haciendo aquí:

Un cliente quería ayuda para monitorear la vida útil de una ventana de Explorer.

"Queremos lanzar una copia de Explorer para abrir una carpeta específica, luego esperar hasta que el usuario cierre la carpeta antes de continuar. Intentamos lanzar una copia de Explorer con la carpeta en la línea de comando, luego hacer un WaitForSingleObject en el mango del proceso, pero la espera a veces se completa inmediatamente sin esperar. ¿Cómo esperamos hasta que el usuario cierra la ventana del explorador?"

Este es otro caso de resolver un problema a mitad de camino y luego tener problemas con la otra mitad.

La razón que Wait­For­Single­Object Las devoluciones inmediatamente es que Explorer es un programa de instancia única (bueno, instancia limitada). Cuando abre una ventana de Explorer, la solicitud se entrega a una copia en ejecución de Explorer y la copia de Explorer que lanzó las salidas. Por eso tu Wait­For­Single­Object regresa de inmediato.

En su caso, la palabra ya se está ejecutando, así que cuando crea un segundo Proceso de palabras e instruirlo para abrir su documento, simplemente entrega la solicitud a la instancia de Word que ya se está ejecutando, y renuncia al segundo proceso que lanzó de inmediato.

Eso es lo que estás viendo cuando describes que "el proceso de ejecución está deteniendo el mío". Porque esa segunda instancia se cierra inmediatamente después de lanzarla, el Exited ¡Se plantea el evento y su código le dice que elimine el archivo!

Observas astutamente que el bloc de notas (a diferencia de Word y Adobe Acrobat) funciona bien. Esto se debe a que el bloc de notas está diseñado para ser una aplicación de instancia múltiple. Puede abrir tantas copias de Bloc de notas como desee; No le importa si ya hay 1 o 6 copias abiertas en el escritorio. Y lo que es más importante, pedirle al shell que abra un documento de texto en el bloc de notas en realidad abre un segundo copia de la aplicación del bloc de notas, en lugar de enviar una solicitud al primero instancia para abrir una nueva ventana para el nuevo documento.

Otros consejos

Debe establecer el proceso.startinfo.useshellexCute a true como esto _OpenFileProces.StartInfo.UseShellExecute = true; Antes de comenzar el proceso y luego debería funcionar, creo ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top