Cómo copiar un archivo mientras está siendo utilizado por otro proceso

¿Es posible copiar un archivo que está siendo utilizado por otro proceso al mismo tiempo?

Pregunto porque cuando trato de copiar el archivo usando el siguiente código, aparece una excepción:

System.IO.File.Copy(s, destFile, true); 

La excepción planteada es:

El proceso no puede acceder al archivo ‘D: \ temp \ 1000000045.zip’ porque lo está utilizando otro proceso.

No quiero crear un nuevo archivo, solo quiero copiarlo o eliminarlo. es posible?

Un ejemplo (nota: acabo de combinar dos resultados de Google, puede que tenga que corregir errores menores;))

La parte más importante es FileShare.ReadWrite al abrir FileStream.

Utilizo un código similar para abrir y leer documentos de Excel mientras Excel aún está abierto y bloqueando el archivo.

  using(var inputFile = new FileStream( "oldFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using (var outputFile = new FileStream("newFile.txt", FileMode.Create)) { var buffer = new byte[0x10000]; int bytes; while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0) { outputFile.Write(buffer, 0, bytes); } } } 

Para crear una copia de un archivo que es leído y / o bloqueado por escritura por otro proceso en Windows, la solución más simple (y probablemente la única) es usar el Servicio de instantáneas de volumen (VSS).

El Servicio de instantáneas de volumen es complejo y difícil de llamar desde el código administrado. Afortunadamente, algunos buenos chats han creado una biblioteca de clases .NET para hacer esto. Consulte el proyecto Alpha VSS en CodePlex: http://alphavss.codeplex.com .

EDITAR

Al igual que con muchos de los proyectos en CodePlex, Alpha VSS ha migrado a GitHub. El proyecto está ahora aquí: https://github.com/alphaleonis/AlphaVSS .

Debería explorar y descubrir qué proceso está bloqueando el archivo. Si este proceso no es tuyo, no tienes manera de resolver el problema. Por supuesto, puede aplicar algunos hacks y liberar manualmente el locking de archivos, pero lo más probable es que este enfoque genere consecuencias insospechadas. Si el proceso es suyo, intente desbloquearlo o bloquearlo con acceso compartido de lectura.

[EDITAR]
La forma más fácil de descubrir el proceso de locking sería usar Process Explorer. Iniciarlo e ingresar el nombre del archivo en Find->Find Handle or DLL... cuadro de diálogo. En los resultados de búsqueda, podría ver qué proceso está bloqueando su archivo. También puede hacer este trabajo en C #. Verifique esto: ¿Qué proceso bloquea un archivo? . también