2010-09-15 96 views
6

我有一個長時間運行的任務,在掛載的USB驅動器上執行一系列的文件操作,我想阻止用戶在發生這種情況時從Finder(或其他地方)彈出驅動器。有一個取消按鈕,可以讓任務在任何時候結束。如何防止在Mac OS X操作期間彈出磁盤?

我曾經假定在任務持續時間內,在安裝的捲上保持文件句柄保持打開狀態會起到訣竅的作用,但它沒有奏效。

這是我試了一下(處理刪除錯誤):

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

_tempFile = [NSFileHandle fileHandleForWritingAtPath:tempFilePath]; 

約我能做些什麼,以確保卷從噴射防止任何想法?

+0

不想破壞你的泡泡,但如果有人只是拔掉他們的USB驅動器?如果驅動器是硬件驅動的,則不可能阻止它被彈出。爲什麼不能給用戶一個非常嚴峻的警告,即他們不應該彈出驅動器,否則操作將失敗? – 2010-09-15 18:22:41

+0

我確實意識到我們不能完全防止無意中斷開連接。儘可能多的我希望用戶被迫進入有意識的決定來停止操作,以便他們可以理解爲什麼某些功能稍後不適合他們。 – mcsheffrey 2010-09-15 18:27:39

+0

@ferrari fan:mcsheffrey想要什麼是有用的,因爲用戶可能會忘記這個任務沒有完成,並以某種方式「保留」磁盤將有助於意外彈出。 – mohsenr 2010-09-15 18:29:47

回答

10

您將需要使用Disk Arbitration API,更具體地說是DARegisterDiskUnmountApprovalCallback。

可以在DADisk.h

創建通過avaliable功能的DADiskRef當回調被調用,然後你就可以決定是否要阻止卸載與否。對於一個人爲的例子:

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; 
} 

正如在評論中指出,這並不能阻止任何人只需拔插頭,但它會給你卸除的明確通知。

0

您正在尋找磁盤仲裁(或DiskArb)框架API。