获取 NSPasteboardTypeFileURL 的 UTI

5

NSFilenamesPboardType在10.14已被弃用,建议使用NSPasteboardTypeFileURL。这使得我得到的文件名为

file:///.file/id=6571367.12885025918

NSWorkspace无法从中获得UTI。

如何从NSPasteboardTypeFileURL获取UTI?

旧代码:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
    NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
    NSDragOperation resultingDragMask = NSDragOperationNone;
    NSPasteboard *pboard = [sender draggingPasteboard];

    if ([[pboard types] containsObject:NSFilenamesPboardType]) {
        NSArray <NSString *>*list = [pboard propertyListForType:NSFilenamesPboardType];
        NSString *firstItem = [list objectAtIndexedSubscript:0];
        NSError *error;
        NSString *UTI = [[NSWorkspace sharedWorkspace] typeOfFile:firstItem error:&error];
        if (!error) {
            if ([[NSImage imageTypes] containsObject:UTI]) {
                resultingDragMask = NSDragOperationCopy;
            }
        }

    } else if ([[pboard types] containsObject:NSPasteboardTypeTIFF]) {
        resultingDragMask = NSDragOperationCopy;
    }

    if (sourceDragMask & NSDragOperationCopy && resultingDragMask & NSDragOperationCopy) {
        return NSDragOperationCopy;
    }
    return NSDragOperationNone;
}

使用 NSPasteboardTypeFileURL 时,我会收到错误提示,指出文件不存在。从剪贴板拖出的内容如下:

打印错误信息: 错误领域=NSCocoaErrorDomain Code=260 "The file “id=6571367.12885025918” couldn’t be opened because there is no such file." UserInfo={NSURL=file:/.file/id=6571367.12885025918 -- file:///Users/xxx/Library/Containers/com.xxx.imageviewfix/Data/, NSFilePath=/Users/xxx/Library/Containers/com.xxx.imageviewfix/Data/file:/.file/id=6571367.12885025918, NSUnderlyingError=0x600000c70d80 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}

2个回答

6

虽然我晚回答了这个问题,但我发现以下方法有效:

  NSArray<Class> *classes = @[[NSURL class]];
  NSDictionary *options = @{};
  NSArray<NSURL*> *files = [pboard readObjectsForClasses:classes options:options];

  for (NSURL *url in files)
  {
     NSString *str = [url path];

     // TODO: do something with str.
  }

与其他答案不同,使用这种方法可以处理多个文件的删除操作。

0

获取NSURL对象的路径可以得到原始文件名。唯一缺少的是NSFilenamesPboardType曾经提供的文件路径数组。

NSString *fileURL = [[NSURL URLFromPasteboard:pboard] path];

更新的代码:

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender
{
    NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
    NSDragOperation resultingDragMask = NSDragOperationNone;
    NSPasteboard *pboard = [sender draggingPasteboard];

    if ([[pboard types] containsObject:NSPasteboardTypeFileURL]) {
        NSString *fileURL = [[NSURL URLFromPasteboard:pboard] path];
        NSError *error;
        NSString *UTI = [[NSWorkspace sharedWorkspace] typeOfFile:fileURL error:&error];
        if (!error) {
            if ([[NSImage imageTypes] containsObject:UTI]) {
                resultingDragMask = NSDragOperationCopy;
            }
        }

    } else if ([[pboard types] containsObject:NSPasteboardTypeTIFF]) {
        resultingDragMask = NSDragOperationCopy;
    }

    if (sourceDragMask & NSDragOperationCopy && resultingDragMask & NSDragOperationCopy) {
        return NSDragOperationCopy;
    }
    return NSDragOperationNone;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接