2010-09-15 3 views
6

Tôi có một tác vụ chạy dài thực hiện một loạt các thao tác tệp trên các ổ đĩa USB được gắn và tôi muốn ngăn người dùng đẩy ổ đĩa khỏi Trình tìm kiếm (hoặc ở nơi khác) trong khi điều này xảy ra. Có nút Hủy cho phép tác vụ được kết thúc bất kỳ lúc nào.Làm thế nào tôi có thể ngăn chặn việc đẩy đĩa ra trong một thao tác trên Mac OS X?

Tôi đã giả định rằng việc giữ một tệp xử lý mở trên ổ đĩa được gắn trong suốt thời gian thực hiện tác vụ sẽ thực hiện thủ thuật, nhưng nó không hoạt động.

Đây là những gì tôi đã cố gắng (lỗi xử lý loại bỏ):

NSString *tempFilePath = @"/Volumes/myVolume/.myTempFile"; 
if ([[NSFileManager defaultManager] fileExistsAtPath:tempFilePath] == NO) { 
    [[NSFileManager defaultManager] createFileAtPath:tempFilePath contents:nil attributes:nil] 
} 

_tempFile = [NSFileHandle fileHandleForWritingAtPath:tempFilePath]; 

Bất kỳ ý tưởng về những gì tôi có thể làm gì để đảm bảo rằng khối lượng bị ngăn cản ejecting?

+0

Không muốn phá vỡ bong bóng của bạn, nhưng nếu ai đó chỉ rút ổ USB của họ ra sao? Nếu ổ đĩa là phần cứng điều khiển thì không thể ngăn nó bị đẩy ra. Tại sao bạn không thể cung cấp cho người dùng một cảnh báo rất nghiêm khắc rằng họ không nên đẩy ổ đĩa ra hoặc hoạt động khác sẽ thất bại? –

+0

Tôi nhận ra rằng chúng tôi không thể ngăn chặn hoàn toàn việc ngắt kết nối vô tình. Càng nhiều càng tốt, tôi muốn người dùng bị ép buộc vào quyết định có ý thức ngừng hoạt động để họ có thể hiểu tại sao một số chức năng không hoạt động cho họ sau này. – mcsheffrey

+0

@ferrari fan: những gì mcsheffrey muốn là hữu ích bởi vì người dùng có thể quên rằng nhiệm vụ này không được hoàn thành và "giữ lại" đĩa theo cách nào đó sẽ giúp đỡ với các trường hợp ngẫu nhiên. – mohsenr

Trả lời

10

Bạn sẽ cần sử dụng API Disk Arbitration, cụ thể hơn là DARegisterDiskUnmountApprovalCallback.

Bạn có thể tạo một DADiskRef qua các chức năng có sẵn trong DADisk.h

Khi callback được gọi, sau đó bạn có thể quyết định xem bạn muốn chặn các unmount hay không. Để có ví dụ giả tạo:

DADissenterRef myUnmountApprovalCallback(DADiskRef disk, void *context) 
{ 
    DADissenterRef result = NULL; // NULL means approval 
    if (stillWorking) { 
     // This is released by the caller, according to the docs 
     result = DADissenterCreate(kCFAllocatorDefault, kDAReturnBusy, CFSTR("<Your App> is busy writing to this device. Please cancel the operation first."); 
    } 
    return result; 
} 

Như đã lưu ý trong phần nhận xét, điều này sẽ không thông báo cho bạn về việc ngắt kết nối rõ ràng.

0

Bạn đang tìm kiếm API khuôn khổ Trọng tài đĩa (hoặc DiskArb).