获取 NSPasteboardTypeFileURL 的 UTI

Mar*_*k H 5 cocoa uti nspasteboard nsworkspace

NSFilenamesPboardType在 10.14 上已弃用,建议使用NSPasteboardTypeFileURL. 这给了我文件名

\n\n
\n

文件:///.file/id=6571367.12885025918

\n
\n\n

NSWorkspace无法摆脱尿路感染。

\n\n

如何感染尿路感染NSPasteboardTypeFileURL

\n\n

旧代码:

\n\n
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender\n{\n    NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];\n    NSDragOperation resultingDragMask = NSDragOperationNone;\n    NSPasteboard *pboard = [sender draggingPasteboard];\n\n    if ([[pboard types] containsObject:NSFilenamesPboardType]) {\n        NSArray <NSString *>*list = [pboard propertyListForType:NSFilenamesPboardType];\n        NSString *firstItem = [list objectAtIndexedSubscript:0];\n        NSError *error;\n        NSString *UTI = [[NSWorkspace sharedWorkspace] typeOfFile:firstItem error:&error];\n        if (!error) {\n            if ([[NSImage imageTypes] containsObject:UTI]) {\n                resultingDragMask = NSDragOperationCopy;\n            }\n        }\n\n    } else if ([[pboard types] containsObject:NSPasteboardTypeTIFF]) {\n        resultingDragMask = NSDragOperationCopy;\n    }\n\n    if (sourceDragMask & NSDragOperationCopy && resultingDragMask & NSDragOperationCopy) {\n        return NSDragOperationCopy;\n    }\n    return NSDragOperationNone;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

NSPasteboardTypeFileURL错误,指出文件不存在。从粘贴板拖动:

\n\n
\n

打印错误描述:\n Error Domain=NSCocoaErrorDomain Code=260 “文件 \xe2\x80\x9cid=6571367.12885025918\xe2\x80\x9d 无法打开\xe2\x80\x99,因为没有这样的\n 文件。” UserInfo={NSURL=文件:/.file/id=6571367.12885025918 --\n file:///Users/xxx/Library/Containers/com.xxx.imageviewfix/Data/,\n NSFilePath=/Users/xxx/Library /Containers/com.xxx.imageviewfix/Data/file:/.file/id=6571367.12885025918,\n NSUnderlyingError=0x600000c70d80 {Error Domain=NSPOSIXErrorDomain\n Code=2“没有这样的文件或目录”}}

\n
\n

asv*_*kau 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.
  }
Run Code Online (Sandbox Code Playgroud)

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