2008-11-03 22 views

Trả lời

14

Bạn có thể sử dụng VSS (Volume Shadow Copy Service, không phải Visual SourceSafe) API cho mục đích này. Trong khi mạnh mẽ, đây không phải là một API dễ sử dụng: Overview of Processing a Backup Under VSS sẽ cung cấp cho bạn ý tưởng về những gì có liên quan.

Mặc dù đó là một API tương đối gần đây, hỗ trợ .NET cho VSS là khá nhiều (và không thể tránh khỏi) không tồn tại. Bạn không thể gọi hầu hết API thông qua Interop, và các chức năng của tệp khung công tác sẽ không hoạt động với không gian tên hạt nhân mà VSS sử dụng để trưng ra các tệp snapshotted. Như một phần thưởng, có những vấn đề khủng khiếp 32/64-bit và XP-vs-Vista, làm cho việc triển khai trở nên thú vị (đội ngũ chịu trách nhiệm ở Microsoft nên thực sự tự hào!)

Dù sao, dự án AlphaVSS có ý định mang đầy đủ Chức năng VSS cho .NET và trông cực kỳ hứa hẹn, mặc dù nó vẫn ở giai đoạn tiền beta. Tuy nhiên, nó có thể chỉ là một thủ thuật cho bạn, và đó là mã nguồn mở (Managed C++).

Để có ví dụ tốt về cách thực hiện mọi việc bằng Win32, hãy xem HoboCopy. Tiện ích này khá hữu ích, và nguồn C++ đầy đủ cũng có sẵn từ SourceForge project page.

5

Gần giống như câu trả lời của tôi để another question:

Nếu bạn đang ở trên Win32, cách chính thức để làm điều đó là để đánh dấu nó được di chuyển trên khởi động lại, và yêu cầu người dùng khởi động lại. Để đánh dấu tệp cần được di chuyển khi khởi động lại, hãy sử dụng MoveFileEx với cờ MOVEFILE_DELAY_UNTIL_REBOOT.

Đó là chức năng tương tự, chỉ lần này bạn không vượt qua NULL làm đích.

4

Tùy thuộc vào những gì chính xác đã khóa tệp của bạn, bạn có thể làm System.IO.File.Copy() hoặc tạo System.IO.BinaryReader và System.IO.BinaryWriter và tạo thủ công bản sao tệp bằng cách đọc các đoạn của tệp bị khóa và ghi chúng vào một tệp mới. Tôi đã thấy các tình huống mà một phương pháp có thể nhưng phương pháp kia không phải là, dựa trên lý do tại sao tệp bị khóa.

Đây là câu trả lời "tất cả .NET".

Các vấn đề liên quan