首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取NSPasteboardTypeFileURL的UTI

获取NSPasteboardTypeFileURL的UTI
EN

Stack Overflow用户
提问于 2019-05-18 12:44:16
回答 2查看 713关注 0票数 5

NSFilenamesPboardType在10.14就被否决了,建议使用NSPasteboardTypeFileURL。这给了我文件名

file:///.file/id=6571367.12885025918

NSWorkspace也无法让UTI脱离困境。

如何从NSPasteboardTypeFileURL获取UTI?

旧代码:

代码语言:javascript
复制
- (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,我得到了不存在状态文件的错误。从纸板上拖来的:

打印错误描述: Error Domain=NSCocoaErrorDomain Code=260“文件”“id=6571367.12885025918”无法打开,因为没有这样的文件。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“无此类文件或目录”}}

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-22 06:30:55

我很晚才回答这个问题,但我发现这是可行的:

代码语言:javascript
复制
  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.
  }

与另一个答案不同,删除多个文件适用于这种方法。

票数 6
EN

Stack Overflow用户

发布于 2019-05-18 13:00:30

获取NSURL对象的路径将获得原始文件名。唯一缺少的是NSFilenamesPboardType用来提供的文件路径数组。

代码语言:javascript
复制
NSString *fileURL = [[NSURL URLFromPasteboard:pboard] path];

更新代码:

代码语言:javascript
复制
- (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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56199062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档