Copia a la mesa de trabajo de archivos de rutas y direcciones url en Snow Leopard o superior

StackOverflow https://stackoverflow.com/questions/9454638

Pregunta

Quiero copiar las rutas de archivo en el portapapeles para que puedan ser copiados en los editores de texto como cadenas, pero quiero que ellos también disponible para el Buscador de copiar los archivos.

He escrito el código que se muestra a continuación compatible con Snow Leopard directrices (por ejemplo, el uso de writeObjects cuando copia las direcciones url de archivos)

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

Pero en algunos editores (como XCode) también la url se pegan como se muestra a continuación (Finder utiliza correctamente la url para copiar/mover)

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

¿Cómo puedo pegar sólo las rutas de archivo sin las direcciones Url de archivos utilizando 10.6 compatible con el código?

El NSFilenamesPboardType el uso de parece desanimado

NSFilenamesPboardType Una matriz de NSString objetos de la designación de uno o más nombres de archivos.En Mac OS X v10.6 y versiones posteriores, utilice writeObjects:para escribir las direcciones Url de archivos a la mesa de trabajo.Disponible en Mac OS X v10.0 y posterior.Declarado en NSPasteboard.h.

¿Fue útil?

Solución

La documentación puede sonar como sólo se debe utilizar writeObjects:, pero solo lo uso para las direcciones Url de archivos.

En la parte inferior de NSPasteboard.h es esta sección:

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

Estos son los viejos tipos que no se debe usar, pero muestra que sólo vas a usar writeObjects: cuando tratando de poner las direcciones Url de archivos (o Url).Y el uso de los tipos de otros datos.

Así que para conseguir el correcto comportamiento:

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];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top