【问题标题】:Unmounting Drive/volume without ejecting卸载驱动器/卷而不弹出
【发布时间】:2016-04-20 23:07:44
【问题描述】:

我想在不弹出的情况下卸载磁盘。为此,我尝试了以下代码

{
  NSString *path;
  CFStringRef *volumeName=(__bridge CFStringRef)path;
  DASessionRef session = DASessionCreate(kCFAllocatorDefault);
  CFURLRef pathRef = CFURLCreateWithString(NULL, CFSTR("/volumes/Untitled"), NULL);
  DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, pathRef);
  DADiskUnmount(disk, kDADiskUnmountOptionForce, NULL, NULL);
}

This code is from this question, Thanks to @zeFree

它可以工作,但我想要卷的动态路径,在代码中它是静态的。我尝试将 NSString 更改为 CFStringRef,然后尝试在 path("/volumes/Untitled") 提及的地方使用,但它仍然相同。

欢迎提出任何建议。

【问题讨论】:

    标签: cocoa disk core-foundation nsworkspace diskarbitration


    【解决方案1】:

    首先,强烈建议您不要使用kDADiskUnmountOptionForce

    这是一种通过基本错误处理和内存管理在给定 URL 卸载卷的方法。

    - (BOOL)unmountVolumeAtURL:(NSURL *)url
        BOOL returnValue = NO;
        DASessionRef session = DASessionCreate(kCFAllocatorDefault);
        if (session) {
            DADiskRef disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, (__bridge CFURLRef)url);
            if (disk) {
                DADiskUnmount(disk, kDADiskUnmountOptionDefault, NULL , NULL);
                returnValue = YES;
                CFRelease(disk);
            } else {
                NSLog(@"Could't create disk reference from %@", url.path);
            }
        } else {
          NSLog(@"Could't create DiskArbritation session");
        }
    
        if (session) CFRelease(session);
        return returnValue;
    }
    

    仍然可以通过在DADiskUnmount 函数中提供回调处理程序来改进错误处理。

    【讨论】:

    • 解决了我的问题先生。想要通知存在一些打字错误,例如 DASessionRef session = DASessionif(disk) CFRelease(disk) 必须在声明它的块内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多