2010-05-17 56 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 

然而该文件得到了重新移动而不是链接

[ 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纳皮尔

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

另一种方式是通过发送a performFileOperation:source:destination:files:tag: messagethe NSWorkspaceRecycleOperation operationa recycleURLs:completionHandler: message告诉NSWorkspace“回收”它。

我不知道它们中的任何一个能在符号链接上运行得如何,但如果您不想处理FSRef s,则值得尝试。

+0

介绍了在10.6。很棒的发现。会尝试。 – neoneye 2010-05-18 07:15:02

+0

neoneye:只有后一种方法在10.6中引入。前一种方法从10.0开始一直存在,并且仍然受到支持。 – 2010-05-18 07:58:54

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) 
} 
相关问题