2011-10-15 48 views
5

tôi sử dụng lệnh dưới đây để xóa một số tập tin sau khi khởi động lại máy:Làm cách nào để hủy hoạt động MoveFileEx bị trì hoãn?

MoveFileEx(PChar(File_Address), Nil, MOVEFILE_DELAY_UNTIL_REBOOT); 

Làm thế nào tôi có thể hủy thực hiện lệnh này và ngăn ngừa các file từ xóa sau khi khởi động lại?

+2

Dường như không có cách nào được hỗ trợ để thực hiện việc này. Điều gì đang thúc đẩy yêu cầu này? –

+2

Cách dễ nhất là không gọi 'MoveFileEx' để xóa tệp ở vị trí đầu tiên cho đến khi bạn hoàn toàn chắc chắn muốn xóa nó. –

Trả lời

13

Tệp bạn enqueue để xóa theo cách này được đặt trong sổ đăng ký theo HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations. Có lẽ bạn có thể xóa các mục từ đó, để ngăn chặn các tập tin bị xóa. Tôi không thể tìm thấy hàm API cho việc này.

+4

+1. Bạn có thể xóa mục nhập từ khóa đăng ký đó bằng cách sử dụng lớp Tregistry của Delphi hoặc API trực tiếp, nhưng lưu ý rằng trên Vista trở lên, bạn sẽ phải đăng nhập với tư cách Quản trị viên để làm như vậy (người dùng bình thường không thể ghi/xóa từ HKLM) . Tất nhiên, giải pháp tốt hơn là không tạo mục nhập ở vị trí đầu tiên cho đến khi bạn hoàn toàn chắc chắn bạn muốn xóa tệp. :) –

0

Tôi đoán bạn có thể sao chép các tập tin (vì nó chưa được xóa chưa) và sau đó sử dụng

MoveFileEx(copy_of_file, original_file, MOVEFILE_DELAY_UNTIL_REBOOT) 

để đưa nó trở lại tại chỗ trong thời gian khởi động lại.

Như Ken White đã chỉ ra, tuy nhiên, sẽ tốt hơn nhiều nếu bạn tránh tình huống này ngay từ đầu.

+0

Đó là [thực sự] (http://msdn.microsoft.com/en-us/library/Aa365240.aspx) được ghi lại. _ "Các hoạt động di chuyển và xóa được thực hiện tại thời điểm khởi động theo cùng thứ tự mà chúng được chỉ định trong ứng dụng gọi." _ – CodeCaster

+0

@CodeCaster, cảm ơn và được phát hiện tốt. Tôi đã chỉnh sửa cho phù hợp. –

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