剪&使用 NSPasteboard 粘贴文件 [英] Cut & paste of files with NSPasteboard
问题描述
我们应该如何切割 &使用 NSPasteboard
粘贴文件?目前我通过写入和读取文件 URL 来实现复制和粘贴.cut 的问题是,在我将 URL 写入粘贴板后,我必须删除该文件.当我尝试粘贴文件时,它不再存在,我无法复制它.我应该在粘贴板上写其他东西吗?我也想过将文件复制到临时隐藏位置,但这似乎有点低效.还有其他解决办法吗?
How are we supposed to cut & paste files using NSPasteboard
? Currently I implemented copy and paste by writing and reading file URLs. The problem with cut is, that after I wrote the URL to the pasteboard, I have to remove the file. And when I try to paste the file it doesn't exist anymore and I can't copy it. Should I write something else onto the pasteboard? I also thought about copying the file to a temporary hidden location, but that seems to be a bit inefficient. Is there any other solution?
推荐答案
您可以使用 kPasteboardTypeFilePromiseContent
.在这种情况下,拖动源负责将文件写入目的地,因此您可以移动文件而不是复制它.
You can use kPasteboardTypeFilePromiseContent
. In this case, the dragging source is responsible to write the file to the destination, so you can move the file instead of duplicating it.
来自 Pasteboard.h
的文档:
/*
* Pasteboard File Promising
*
* Summary:
* With the FSSpec type being deprecated and removed for 64 bit it is necessary
* to introduce a replacement for kDragFlavorTypePromiseHFS. The replacement comes
* in the form of two new Uniform Type Identifiers specifically for use with the
* pasteboard and promised files. Like the old HFS promise mechanism, the new UTI
* based method still requires a multistage handshake between sender and receiver
* but the process is somewhat simplified.
*
* Order of operations on copy or drag
*
* 1) The sender promises kPasteboardTypeFileURLPromise for a file yet to be created.
* 2) The sender adds kPasteboardTypeFilePromiseContent containing the UTI describing
* the file's content.
*
* Order of operations on paste or drop
*
* 3) The receiver asks for kPasteboardTypeFilePromiseContent to decide if it wants the file.
* 4) The receiver sets the paste location with PasteboardSetPasteLocation.
* 5) The receiver asks for kPasteboardTypeFileURLPromise.
* 6) The sender's promise callback for kPasteboardTypeFileURLPromise is called.
* 7) The sender uses PasteboardCopyPasteLocation to retrieve the paste location, creates the file
* and keeps its kPasteboardTypeFileURLPromise promise.
*
* Automatic translation support has been added so clients operating in the modern
* kPasteboardTypeFileURLPromise and kPasteboardTypeFilePromiseContent world can continue
* to communicate properly with clients using the traditional kDragFlavorTypePromiseHFS and
* kDragPromisedFlavor model.
*/
示例:
@implementation NSPasteboard (DestinationFolder)
- (NSURL*)pasteLocation
{
NSURL* fileURL = nil;
PasteboardRef pboardRef = NULL;
PasteboardCreate((CFStringRef)[self name], &pboardRef);
if (pboardRef != NULL) {
PasteboardSynchronize(pboardRef);
PasteboardCopyPasteLocation(pboardRef, (CFURLRef*)&fileURL);
CFRelease(pboardRef);
}
return [fileURL autorelease];
}
- (void)setPasteLocation:(NSURL *)url
{
PasteboardRef pboardRef = NULL;
PasteboardCreate((CFStringRef)[self name], &pboardRef);
if (pboardRef != NULL) {
PasteboardSynchronize(pboardRef);
PasteboardSetPasteLocation(pboardRef, (CFURLRef)url);
CFRelease(pboardRef);
}
}
@end
这篇关于剪&使用 NSPasteboard 粘贴文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!