Вырезать и вставлять файлы с помощью NSPasteboard

Как мы должны вырезать и вставлять файлы, используя NSPasteboard? В настоящее время я реализовал копирование и вставку, записывая и читая URL-адреса файлов. Проблема с вырезанием заключается в том, что после того, как я записал URL-адрес на монтажный стол, мне нужно удалить файл. И когда я пытаюсь вставить файл, его больше не существует, и я не могу его скопировать. Должен ли я написать что-то еще на монтажном столе? Я также думал о том, чтобы скопировать файл во временное скрытое место, но это кажется немного неэффективным. Есть ли другое решение?


person DrummerB    schedule 23.05.2012    source источник
comment
вы можете проверить это (прочитайте комментарии здесь stackoverflow.com/questions/9409852/ ), как в этом комментарии говорится, что вырезание, вероятно, недоступно через API. Есть ли способ получить подтверждение после завершения копирования? потому что вы можете безопасно удалить файл в этот момент   -  person owen gerig    schedule 24.05.2012
comment
Я уже читал это, и это не дает решения.   -  person DrummerB    schedule 24.05.2012


Ответы (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
person Yoav    schedule 01.09.2013