2008-11-03 5 views

Antwort

14

Sie können zu diesem Zweck die VSS-API (Volume Shadow Copy Service, nicht Visual SourceSafe) verwenden. Obwohl es leistungsfähig ist, ist dies nicht gerade eine einfach zu bedienende API: Die Overview of Processing a Backup Under VSS sollte Ihnen eine Idee geben, was involviert ist.

Obwohl es eine relativ neue API ist, ist .NET-Unterstützung für VSS ziemlich (und unentschuldbar) nicht existent. Sie können die meisten APIs nicht über Interop aufrufen, und die Framework-Dateifunktionen funktionieren nicht mit dem Kernel-Namespace, den VSS zum Freigeben der Snapshot-Dateien verwendet. Als Bonus gibt es horrende 32/64-Bit und XP-vs-Vista Probleme, so dass Bereitstellung spannend wie gut (die verantwortliche Team bei Microsoft sollte wirklich stolz sein!)

Wie dem auch sei, das AlphaVSS Projekt voll zu bringen beabsichtigt VSS-Funktionalität zu .NET, und sieht sehr vielversprechend aus, obwohl es noch in der Pre-Beta-Phase ist. Es kann jedoch nur den Trick für Sie tun, und es ist Open Source (Managed C++).

Für ein gutes Beispiel, wie man Dinge mit Win32 macht, siehe HoboCopy. Das Dienstprogramm ist allein sehr nützlich, und eine vollständige C++ - Quelle ist ebenfalls von der SourceForge project page verfügbar.

5

Fast die gleiche wie meine Antwort auf another question:

Wenn Sie auf Win32 sind, der offizielle Weg, es zu tun ist, um sie zu markieren beim Neustart verschoben werden, und bitten Sie den Benutzer neu zu starten. Verwenden Sie MoveFileEx mit dem Flag MOVEFILE_DELAY_UNTIL_REBOOT, um die Datei zu markieren, die beim Neustart verschoben werden soll.

Es ist die gleiche Funktion, nur dieses Mal übergeben Sie nicht NULL als Ziel.

4

Je nachdem, was genau Ihre Datei gesperrt hat, können Sie entweder System.IO.File.Copy() ausführen oder einen System.IO.BinaryReader und einen System.IO.BinaryWriter erstellen und manuell eine Kopie der Datei erstellen indem Sie Teile der gesperrten Datei lesen und in eine neue Datei schreiben. Ich habe Situationen gesehen, in denen eine Methode möglich war, aber die andere nicht, basierend darauf, warum die Datei gesperrt wurde.

Dies ist die "alle .NET" Antwort.