3

我想在剪贴板中复制文件路径,以便可以在文本编辑器中将它们作为字符串复制,但我希望它们也可用于 Finder 来复制文件。

我已经编写了符合 Snow Leopard 准则的代码(例如,在复制文件 url 时使用 writeObjects)

NSString* path1 = @"/Users/dave/trash/mas.sh";
NSString* path2 = @"/Users/dave/trash/books.xml";
NSURL* url1 = [NSURL fileURLWithPath:path1 isDirectory:NO];
NSURL* url2 = [NSURL fileURLWithPath:path2 isDirectory:NO];
NSArray* paths = [NSArray arrayWithObjects:path1, path2, nil];

NSString* pathPerLine = [paths componentsJoinedByString:@"\n"];
// Put strings on top otherwise paster app receives the url (only the first)
// Urls will be used by Finder for files operations (copy, move)
NSArray* urls = [NSArray arrayWithObjects:pathPerLine, url1, url2, nil];
NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
[pasteboard clearContents];
[pasteboard writeObjects:urls];

但在某些编辑器(如 XCode)上,也会粘贴 url,如下所示(Finder 正确使用 url 来复制/移动)

/Users/dave/trash/mas.sh
/Users/dave/trash/books.xml
file://localhost/Users/dave/trash/mas.sh
file://localhost/Users/dave/trash/books.xml

如何使用 10.6 兼容代码仅粘贴没有文件 URL 的文件路径?

NSFilenamesPboardType的使用似乎不鼓励

NSFilenamesPboardType 指定一个或多个文件名的 NSString 对象数组。在 Mac OS X v10.6 及更高版本上,使用 writeObjects: 将文件 URL 写入粘贴板。在 Mac OS X v10.0 及更高版本中可用。在 NSPasteboard.h 中声明。

4

1 回答 1

5

该文档听起来像是您必须仅使用writeObjects:,但您仅将其用于文件 URL。

在 NSPasteboard.h 的底部是这个部分:

APPKIT_EXTERN NSString *NSStringPboardType;     // Use NSPasteboardTypeString
APPKIT_EXTERN NSString *NSFilenamesPboardType;      // Use -writeObjects: to write file URLs to the pasteboard

这些是您不应该使用的旧类型,但它表明您仅writeObjects:在尝试放置文件 URL(或 URL)时使用。并将类型用于其他数据。

所以要获得正确的行为:

NSString* path1 = @"/Users/dave/trash/mas.sh";
NSString* path2 = @"/Users/dave/trash/books.xml";
NSURL* url1 = [NSURL fileURLWithPath:path1 isDirectory:NO];
NSURL* url2 = [NSURL fileURLWithPath:path2 isDirectory:NO];
NSArray* paths = [NSArray arrayWithObjects:path1, path2, nil];

NSString* pathPerLine = [paths componentsJoinedByString:@"\n"];

//Note, only the URLs not the pathsPerLine
NSArray* urls = [NSArray arrayWithObjects:url1, url2, nil];
NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
[pasteboard clearContents];
[pasteboard writeObjects:urls];
//Now add the pathsPerLine as a string
[pasteboard setString:pathPerLine forType:NSStringPboardType];
于 2012-08-21T13:29:15.593 回答