剪&使用 NSPasteboard 粘贴文件 [英] Cut & paste of files with NSPasteboard

查看:36
本文介绍了剪&使用 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆