2013-04-26 68 views
0

這個問題說明了一切。如何從NSURL獲取代表可移動介質的塊設備?我想從/Volumes/MyDevice得到的是類似/dev/disk2。我想知道如果沒有使用IOKit框架,這是可能的!任何幫助表示讚賞。從NSURL獲取塊設備

回答

2

DiskArbitration.framework將讓你有:

NSURL *volumeURL = [NSURL fileURLWithPath:@"/Volumes/YourDisk"]; 

DASessionRef session = DASessionCreate(kCFAllocatorDefault); 
DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, 
              session, 
              (__bridge CFURLRef)volumeURL); 

NSDictionary *desc = CFBridgingRelease(DADiskCopyDescription(disk)); 

/* See DADisk.h for a list of available keys */ 
NSLog(@"%@", desc[(NSString *)kDADiskDescriptionMediaBSDNameKey]); 

CFRelease(disk); 
CFRelease(session); 

正如statfs(2)

struct statfs s; 
statfs([[volumeURL path] fileSystemRepresentation], &s); 
printf("%s\n", s.f_mntfromname); 
+0

閱讀f_mntfromname'的'說明在手冊頁,它聽起來不像提問者想要的東西,但我試過了,它確實是一個設備路徑。 DiskArb代碼返回*略有不同:它不是完整的'/ dev/disk4'路徑,只是名稱'disk4'。 – 2013-04-26 20:34:50

+0

啊,是的,這是真的。我在我的一些代碼中對/ dev前綴進行了硬編碼 - 考慮到它永遠存在(並且DiskManagement.framework似乎也這樣做),我認爲它足夠安全。我同意'f_mntfromname'被混淆記錄。 – jatoben 2013-04-26 21:13:40

+0

DiskArb作爲私有框架在10.3,IIRC中引入;通過文件,它在10.4被公開。 – 2013-04-26 21:23:17