I have a long-running task that performs a series of file operations on mounted USB drives and I want to prevent users from ejecting the drive from Finder (or elsewhere) while this happens. There is a Cancel button that allows the task to be ended at any time.
I had assumed that keeping a file handle open on the mounted volume for the duration of the task would do the trick, but it hasn't worked.
This is what I tried (error handling removed):
NSString *tempFilePath = @"/Volumes/myVolume/.myTempFile";
if ([[NSFileManager defaultManager] fileExistsAtPath:tempFilePath] == NO) {
[[NSFileManager defaultManager] createFileAtPath:tempFilePath contents:nil attributes:nil]
}
_tempFile = [NSFileHandle fileHandleForWritingAtPath:tempFilePath];
Any ideas about what I can do to ensure that the volume is prevented from ejecting?
You'll need to use the Disk Arbitration API, more specifically the DARegisterDiskUnmountApprovalCallback.
You can create a
DADiskRef
via the functions avaliable in DADisk.hWhen the callback is called, you can then decide whether you want to block the unmount or not. For a contrived example:
As noted in the comments, this doesn't prevent anyone from just pulling the plug, but it will give you notification of explicit unmounts.