2010-05-17 5 views
4

Я не вижу никаких параметров для функции FSPathMoveObjectToTrashSync() для следующих ссылок.Как перенести символическую ссылку на корзину?

Вот что я попытался

Создать ссылку и файл

[ 21:32:41 /tmp ] $ touch my_file 
[ 21:32:45 /tmp ] $ ln -s my_file my_link 
[ 21:32:52 /tmp ] $ la 
total 8 
drwxrwxrwt 12 root  wheel 408 17 Maj 21:32 . 
[email protected] 6 root  wheel 204 9 Sep 2009 .. 
-rw-r--r-- 1 neoneye wheel  0 17 Maj 21:32 my_file 
lrwxr-xr-x 1 neoneye wheel  7 17 Maj 21:32 my_link -> my_file 

Переместите ссылку на помойку

OSStatus status = FSPathMoveObjectToTrashSync(
    "/tmp/my_link", 
    NULL, 
    kFSFileOperationDefaultOptions 
); 
NSLog(@"status: %i", (int)status); 

Выход

status: 0 

Однако файл идет t удален, а не ссылка

[ 21:32:55 /tmp ] $ la 
total 8 
drwxrwxrwt 11 root  wheel 374 17 Maj 21:33 . 
[email protected] 6 root  wheel 204 9 Sep 2009 .. 
lrwxr-xr-x 1 neoneye wheel  7 17 Maj 21:32 my_link -> my_file 
[ 21:33:05 /tmp ] $ 

Как я могу перемещать символические ссылки на мусор?


Решение .. спасибо Rob Napier

NSString* path = @"/tmp/my_link"; 
OSStatus status = 0; 

FSRef ref; 
status = FSPathMakeRefWithOptions(
    (const UInt8 *)[path fileSystemRepresentation], 
    kFSPathMakeRefDoNotFollowLeafSymlink, 
    &ref, 
    NULL 
); 
NSAssert((status == 0), @"failed to make FSRef"); 

status = FSMoveObjectToTrashSync(
    &ref, 
    NULL, 
    kFSFileOperationDefaultOptions 
); 
NSLog(@"status: %i", (int)status); 

ответ

5

Использование FSPathMakeRefWithOptions() для создания FSRef к ссылке. Затем используйте FSMoveObjectToTrashSync(), чтобы удалить его.

3

Другой способ - сообщить NSWorkspace «переработать» его, отправив его либо a performFileOperation:source:destination:files:tag: message с the NSWorkspaceRecycleOperation operation, либо a recycleURLs:completionHandler: message.

Я не знаю, насколько хорошо любой из них будет работать на символических ссылках, но стоит попробовать, если вы предпочитаете не иметь дело с FSRef.

+0

Введенный в 10.6. Отличная находка. Попытаюсь. – neoneye

+0

neoneye: Только последний метод был введен в 10.6. Первый метод существует с 10.0 и по-прежнему поддерживается. –

0

мой ретро-футуристический подход

https://github.com/reklis/recycle

// 
// main.swift 
// recycle 
// 
// usage: recycle <files or directories to throw out> 
// 

import Foundation 
import AppKit 

var args = NSProcessInfo.processInfo().arguments 
args.removeAtIndex(0) // first item in list is the program itself 

var w = NSWorkspace.sharedWorkspace() 
var fm = NSFileManager.defaultManager() 

for arg in args { 
    let path = arg.stringByStandardizingPath; 

    let file = path.lastPathComponent 
    let source = path.stringByDeletingLastPathComponent 

    w.performFileOperation(NSWorkspaceRecycleOperation, 
     source:source, 
     destination: "", 
     files: [file], 
     tag: nil) 
}