【问题标题】:Cut & paste of files with NSPasteboard使用 NSPasteboard 剪切和粘贴文件
【发布时间】:2012-05-23 20:29:41
【问题描述】:

我们应该如何使用NSPasteboard 剪切和粘贴文件?目前我通过写入和读取文件 URL 来实现复制和粘贴。 cut 的问题是,在我将 URL 写入粘贴板之后,我必须删除该文件。当我尝试粘贴该文件时,它不再存在并且我无法复制它。我应该在粘贴板上写点别的吗?我也想过将文件复制到一个临时隐藏的位置,但这似乎有点低效。还有其他解决办法吗?

【问题讨论】:

  • 你可以看看这个(在这里阅读 cmets stackoverflow.com/questions/9409852/… )评论说 cut 可能无法通过 api 获得。复制完成后有什么方法可以得到确认吗?因为那时您可以安全地删除文件
  • 我已经读过了,它没有提供任何解决方案。

标签: objective-c cocoa copy-paste appkit nspasteboard


【解决方案1】:

您可以使用kPasteboardTypeFilePromiseContent。在这种情况下,拖动源负责将文件写入目标,因此您可以移动文件而不是复制它。

来自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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多