2010-09-15 11 views
6

Takılı USB sürücülerinde bir dizi dosya işlemi gerçekleştiren uzun süredir devam eden bir görevim var ve kullanıcıların bu durumda sürücüyü Finder'dan (veya başka bir yerden) çıkarmasını önlemek istiyorum. Görevin herhangi bir zamanda sona erdirilmesine izin veren bir İptal düğmesi vardır.Mac OS X'teki bir işlem sırasında diskin çıkarılmasını nasıl önleyebilirim?

Görev süresi boyunca takılan birim üzerinde bir dosya tanıtıcısı açık tutmanın hile yapacağı varsayılmıştır, ancak işe yaramadı. Ben hacim çıkartmada engellenir sağlamak için neler yapabileceği hakkında

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

_tempFile = [NSFileHandle fileHandleForWritingAtPath:tempFilePath]; 

Herhangi bir fikir:

Bu benim (hata kaldırıldı sokulması) denedik nedir?

+0

Kabarcınızı patlatmak istemezsiniz, fakat birileri USB sürücülerini takarsa ne olur? Sürücü donanım tahrikli ise, çıkarılmasını engellemek imkansızdır. Neden kullanıcıya sürücüyü çıkarmamaları için çok sert bir uyarı veremiyorsunuz yoksa işlem başarısız olacak mı? –

+0

Farkında olmayan bir bağlantıyı tamamen önleyemeyeceğimizin farkındayım. Mümkün olduğu kadarıyla, kullanıcının işlemi durdurmak için bilinçli bir karar vermek zorunda kalmasını isterim, böylece bazı işlevselliklerin neden daha sonra onlar için çalışmadığını anlayabilirler. – mcsheffrey

+0

@ferrari fan: ne mcsheffrey istiyor, çünkü kullanıcı bu görevin bitmediğini ve diskin bir şekilde "saklanmasını" yanlışlıkla esip atmaya yardımcı olacağını unutabilir. – mohsenr

cevap

10

Disk Arbitration API'sini, daha spesifik olarak DARegisterDiskUnmountApprovalCallback'i kullanmanız gerekir. Geri arama çağrıldığında

Sen kaldırın veya değil engellemek isteyip sonra karar verebilir DADisk.h

DAİREMİZ fonksiyonları aracılığıyla DADiskRef oluşturabilir. Bir yapmacık Örneğin:

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

açıklamalarda belirtildiği gibi, bu sadece fişi çekerek kimseyi engellemez, ancak açık bağını çözmek sizi küçük bildirim verecektir.

0

Disk Tahkim (veya DiskArb) çerçeve API'lerini arıyorsunuz.