gpt4 book ai didi

cocoa - 从 NSAttributedString 中的 nsfilewrapper/nstextattachment 获取文件名和路径

转载 作者:行者123 更新时间:2023-12-03 16:10:35 24 4
gpt4 key购买 nike

我有一个基本的 NSTextView,启用了富文本和图形(在 IB 中)。我想要获取的是拖入的任何图像的路径和文件名,以便我可以将它们传递给另一个类。

我是 NSAttributedString 的新手,但我有一个使用 enumerateAttributesInRange:options:usingBlock: 寻找 NSattachmentAttributeName 的循环,一切正常。但更深入一些,我到达了 fileWrapper 类,它是 apparent inability to give me the path of the item

我如何获取 NSTextAttachment 的名称和路径?

相关:有没有一种更简单的方法来获取所有这些属性,然后逐步遍历属性?

非常感谢!

最佳答案

虽然我个人鄙视 NSFileWrapper 的设计,但如果您只需要每个附件的数据,您可以通过 NSFileWrapper 的 regularFileContents 方法将其作为 NSData 实例访问。但是,我的应用程序需要一个有效且明确的附件路径名。要获得它比应有的工作要多得多:

您可以子类化您的 NSTextView 并覆盖 NSDraggingDestination Protocol 方法 draggingEntered: 并且您可以在拖动操作期间遍历传递给您的应用程序的 NSPasteboardItem 对象。我选择将路径名及其 inode 号保留在 NSMutableDictionary 中,因为 NSFileWrapper 可以为您提供引用文件的 inode 。稍后,当我通过 NSAttributedString 访问 NSTextView 内容时,我可以使用 inode 作为索引来获取附件的路径名。

- (NSDragOperation)draggingEntered:(id < NSDraggingInfo >)sender {

// get pasteboard from dragging operation

NSPasteboard *pasteboard = [sender draggingPasteboard];

NSArray *pasteboardItems = [pasteboard pasteboardItems];

for ( NSPasteboardItem *pasteboardItem in pasteboardItems ) {

// look for a file url type from the pasteboard item

NSString *draggedURLString = [pasteboardItem stringForType:@"public.file-url"];

if (draggedURLString != nil) {

NSURL *draggedURL = [NSURL URLWithString:draggedURLString];

NSString *draggedPath = [draggedURL path];

NSLog(@"pathname: %@", draggedPath);

// do something with the path

// get file attributes

NSDictionary *draggedAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:draggedPath error:nil];

if ( draggedAttributes == nil)
continue;

// the NSFileWrapper allows access to the absolute file via NSFileSystemFileNumber
// put the path and the inode (returned as an NSNumber) into a NSMutableDictionary

NSNumber *draggedInode = [draggedAttributes objectForKey:NSFileSystemFileNumber];

[draggedFiles setObject:draggedPath forKey:draggedInode];
}

}

return [super draggingEntered:sender];
}

我的解决方案的一个问题(不会影响我的应用程序)是,将多个文件拖到 View 中(单独或一起),这些文件是同一文件的硬链接(hard link),只会作为添加到的最后一个路径名进行索引共享 inode 的字典。根据您的应用程序如何使用路径名,这可能是一个问题。

关于cocoa - 从 NSAttributedString 中的 nsfilewrapper/nstextattachment 获取文件名和路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com