Скопируйте и вставьте пути к файлам карт и URL-адреса на Snow Leopard или выше - PullRequest
3 голосов
/ 26 февраля 2012

Я хочу скопировать пути к файлам в буфере обмена, чтобы их можно было копировать в текстовых редакторах в виде строк, но я хочу, чтобы они также были доступны для Finder для копирования файлов.

Я написал приведенный ниже код, совместимый со SnowРекомендации Leopard (например, использовать writeObjects при копировании 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"];
// 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

Как можно вставить только пути к файлам без URL-адресов файлов, используя код, соответствующий 10.6? *

NSFilenamesPboardType использование кажется не рекомендуется

NSFilenamesPboardType Массив объектов NSString, обозначающих одно или несколько имен файлов.В Mac OS X 10.6 и более поздних версиях используйте writeObjects: для записи файловых URL-адресов в монтажную панель.Доступный в Mac OS X v10.0 и позже.Объявлено в NSPasteboard.h.

1 Ответ

5 голосов
/ 21 августа 2012

Документация может звучать так, как будто вы должны использовать только 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];
...