2008-11-03 16 views

Respuesta

14

Puede utilizar la API VSS (Volume Shadow Copy Service, no Visual SourceSafe) para este fin. Si bien es potente, no es exactamente una API fácil de usar: el Overview of Processing a Backup Under VSS debería darle una idea de lo que implica.

Aunque es una API relativamente reciente, el soporte de .NET para VSS es prácticamente inexcusable (inexcusable). No puede llamar a la mayoría de la API a través de Interop, y las funciones del archivo de Framework no funcionarán con el espacio de nombres del kernel que VSS usa para exponer los archivos capturados. Como beneficio adicional, hay problemas terribles de 32/64 bits y XP-vs-Vista, lo que hace que la implementación también sea emocionante (¡el equipo responsable de Microsoft debería estar realmente orgulloso!)

De todos modos, el proyecto AlphaVSS tiene la intención de llevar La funcionalidad de VSS para .NET, y se ve extremadamente prometedora, a pesar de que todavía está en etapa pre-beta. Sin embargo, podría hacer el truco para usted, y es de código abierto (Managed C++).

Para obtener un buen ejemplo de cómo hacer cosas con Win32, consulte HoboCopy. La utilidad es bastante útil por sí misma, y ​​la fuente completa de C++ también está disponible en el SourceForge project page.

5

casi lo mismo que mi respuesta a another question:

Si usted está en Win32, la forma oficial de hacerlo es marcar que se mueva en el reinicio, y pedir al usuario que reinicie. Para marcar el archivo que se moverá al reiniciar, use MoveFileEx con la bandera MOVEFILE_DELAY_UNTIL_REBOOT.

Es la misma función, solo que esta vez no pasa NULL como destino.

4

Dependiendo de qué haya bloqueado exactamente su archivo, puede hacer System.IO.File.Copy(), o crear un System.IO.BinaryReader y System.IO.BinaryWriter y crear manualmente una copia del archivo leyendo fragmentos del archivo bloqueado y escribiéndolos en un nuevo archivo. He visto situaciones en las que un método era posible pero el otro no, en función de por qué el archivo estaba bloqueado.

Esta es la respuesta "all .NET".

Cuestiones relacionadas