Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 复制到Snow Leopard或更高版本上的粘贴板文件路径和URL_Cocoa_Osx Snow Leopard_Pasteboard - Fatal编程技术网

Cocoa 复制到Snow Leopard或更高版本上的粘贴板文件路径和URL

Cocoa 复制到Snow Leopard或更高版本上的粘贴板文件路径和URL,cocoa,osx-snow-leopard,pasteboard,Cocoa,Osx Snow Leopard,Pasteboard,我想复制剪贴板中的文件路径,以便它们可以作为字符串在文本编辑器中复制,但我希望Finder也可以使用它们来复制文件 我已经按照雪豹指南编写了下面所示的代码(例如,在复制文件URL时使用writeObject) 但在某些编辑器(如XCode)上,URL也会按如下所示粘贴(Finder正确使用URL进行复制/移动) 如何使用10.6兼容代码仅粘贴文件路径而不粘贴文件URL 这种用法似乎不可取 NSFileNamesPardType 指定一个或多个文件名的NSString对象数组。 在Mac OS X

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

我已经按照雪豹指南编写了下面所示的代码(例如,在复制文件URL时使用writeObject)

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

如何使用10.6兼容代码仅粘贴文件路径而不粘贴文件URL

这种用法似乎不可取

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


文档可能听起来像您只能使用
writeObjects:
,但您只能将其用于文件URL

在NSPasteboard.h的底部是该部分:

APPKIT_EXTERN NSString *NSStringPboardType;     // Use NSPasteboardTypeString
APPKIT_EXTERN NSString *NSFilenamesPboardType;      // Use -writeObjects: to write file URLs to the pasteboard
这些是您不应该使用的旧类型,但它表明您仅在尝试放置文件URL(或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"];

//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];

在10.8下,仅粘贴第一个路径,并使用file://前缀协议粘贴它。您是指使用此代码还是在Finder中?我在10.8上,代码和查找程序都粘贴所有文件名,并且没有文件://前缀。我运行您的代码段(在修复最后一行pathsPerLine是pathPerLine上的错误后),当我粘贴到KomodoEdit上时,我只获得此表单中的一个路径(预期两个路径)file://localhost/Users/dave/trash/mas.sh,粘贴在其他应用程序(如TextWranger)上效果很好,但komodo edit存在问题,它是通过URL而不是字符串获取的,并且不像其他应用程序那样删除文件协议。
APPKIT_EXTERN NSString *NSStringPboardType;     // Use NSPasteboardTypeString
APPKIT_EXTERN NSString *NSFilenamesPboardType;      // Use -writeObjects: to write file URLs to the pasteboard
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];