2012-05-23 5 views
0

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

+0

вы можете проверить это (читать комментарии здесь http://stackoverflow.com/questions/9409852/whats-the-best- стратегия-для-реализации-вырезать-и-вставить-в-какао ), как этот комментарий говорит, что разрез, вероятно, недоступен через api. Есть ли способ получить подтверждение после завершения копирования? потому что вы можете безопасно удалить файл в этот момент –

+0

Я уже прочитал это и не предлагает никакого решения. – DrummerB

ответ

1

Вы можете использовать kPasteboardTypeFilePromiseContent. В этом случае источник перетаскивания отвечает за запись файла в пункт назначения, поэтому вы можете переместить файл, а не дублировать его.

Docs из 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