拖放时可以从粘贴板获得完整路径吗?

时间:2010-12-06 01:28:29

标签: objective-c cocoa drag-and-drop

我支持在IKImageBrowserView上执行拖放操作。在我的拖放目标委托中,我接受NSFilenamesPboardType丢弃。奇怪的是,我得到的文件路径字符串都以“/ Users / ...”而不是“file:// localhost / ...”开头,就像我在使用NSOpenPanel时得到的那样。当我将这些转换为NSURL以供IKImageBrowserView用于显示图像时,它会混淆,因为它只能理解以“file:// localhost / ...”开头的完整路径。我可以破解前缀,正如我在下面的代码段中所做的那样,但我想知道是否有一种编程方式来获得完整路径?

if ([[pasteboard types] containsObject:NSFilenamesPboardType])
{
    NSData* data = [pasteboard dataForType:NSFilenamesPboardType];
    if (data)
    {
        NSString* errorDescription;
        NSArray* filenames = [NSPropertyListSerialization
            propertyListFromData:data
            mutabilityOption:kCFPropertyListImmutable
            format:nil
            errorDescription:&errorDescription];

        for (id filename in filenames)
        {   
            NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"file://localhost%@", filename]];

            NSLog(@"Adding URL: %@", url);

1 个答案:

答案 0 :(得分:5)

要从完整路径创建文件URL,请不要自己添加file://前缀。只需使用

    NSURL* url=[NSURL fileURLWithPath:pathString];

请参阅the documentation

从操作系统的角度来看,

   /Users/myname/file.txt

是系统中文件的完整路径。在允许各种网络访问的更高级API中,通过放置file://协议来区分本地文件。 这些pboard API早于API中流行的URL使用,这就是它将路径作为完整路径而不是文件URL返回的原因。