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