如何在 OS X 上获取可移动卷的 NSURL 并在安装时发出通知?

Posted

技术标签:

【中文标题】如何在 OS X 上获取可移动卷的 NSURL 并在安装时发出通知?【英文标题】:How to get NSURL of removable Volumes on OS X and notification when it mounts? 【发布时间】:2016-01-24 19:05:51 【问题描述】:

我需要检测 USB 驱动器(例如Office23,安装在 OS X 中,还可以搜索文件,例如。驱动器中的 jan.txt 并将其复制到应用程序包中。

我正在使用以下方法来查找是否已安装卷:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error = error;

NSArray *keys = @[NSURLVolumeNameKey, NSURLVolumeIsRemovableKey, NSURLVolumeIsEjectableKey];
NSArray *volumeURL = [fileManager mountedVolumeURLsIncludingResourceValuesForKeys:keys options:NSVolumeEnumerationProduceFileReferenceURLs];

for (NSURL *url in volumeURL) 
    NSLog(@"URL %@", url);

结果:file:///.file/id=6571367.2/

如何获取 Volume 中文件的 NSURL?

编辑 1:

 NSArray *keys = [NSArray arrayWithObjects:NSURLVolumeNameKey, NSURLVolumeIsRemovableKey, nil];
    NSArray *urls = [[NSFileManager defaultManager] mountedVolumeURLsIncludingResourceValuesForKeys:keys options:0];
    NSURL *officeDriveURL;
    for (NSURL *url in urls) 
        NSError *error;
        NSNumber *isRemovable;
        NSString *volumeName;
        [url getResourceValue:&isRemovable forKey:NSURLVolumeIsRemovableKey error:&error];
        if ([isRemovable boolValue]) 
            [url getResourceValue:&volumeName forKey:NSURLVolumeNameKey error:&error];
            if ([[url absoluteString] containsString:@"Office"]) 
                officeDriveURL = url;
            

        
    
    NSURL *fullURL = [officeDriveURL URLByAppendingPathComponent:@"documents/My File2.txt"];

    if ([[NSFileManager defaultManager]fileExistsAtPath:[fullURL absoluteString]]) 
        NSLog(@"YES FILE Exist %@", fullURL);
    

不过,FileManager 还是找不到 url。

完整网址为:file:///Volumes/Office/documents/My%File2.txt

当我通过 Finder 或 NSFileManager 进行检查时,这不起作用,但路径是正确的。

【问题讨论】:

你为什么要传递NSVolumeEnumerationProduceFileReferenceURLs? documentation 表示它将生成文件引用 URL,而不是基于路径的 URL。将零作为options 的参数传递,你应该很高兴。 @Cristik,我更改了方法,并获取了卷路径,但是当我向其中添加扩展名时,NSFileManager 找不到它。 @Cristik,路径正确,仍然无法通过它定位。 我的意思是,fileExistAtPath 的结果为 False NSWorkspaceDidMountNotification of NSWorkspace 【参考方案1】:

我不知道为什么FileManager 没有使用[NSURL absoluteString] 方法找到文件,当我从file:///Volumes/Office/documents/My%File2.txt 中删除file:// 并修改了%20 时,得到了引入 (My%20File2,txt),它起作用了。

【讨论】:

以上是关于如何在 OS X 上获取可移动卷的 NSURL 并在安装时发出通知?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OS X 上安装 Apache Ant?

如何在 OS X 中读取 midi 文件并获取曲目的预设信息

在 OS X 上使用 python 的 CoreLocation

如何在 OS X 上获取正在读取文件的通知?

如何确定是不是在 Mac OS X 上剥离了二进制文件?

如何在 Linux 和 OS X 上获取本地机器的主 IP 地址? [关闭]