How to move a symbolic link to the cart?

I do not see any parameters for the FSPathMoveObjectToTrashSync() function for the following links.

Here is what I tried

Create a link and file

 [ 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 . drwxr-xr-x@ 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 

Move the link to the basket

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

Exit

 status: 0 

However, the file was deleted, not the link.

 [ 21:32:55 /tmp ] $ la total 8 drwxrwxrwt 11 root wheel 374 17 Maj 21:33 . drwxr-xr-x@ 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 ] $ 

How can I move symbolic links to the trash?


Solution .. thanks to Rob Napir

 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); 
+4
source share
3 answers

Use FSPathMakeRefWithOptions() to create an FSRef for reference. Then use FSMoveObjectToTrashSync() to remove it.

+5
source

Another way would be to tell NSWorkspace to "recycle" it by sending it the message performFileOperation:source:destination:files:tag: using the NSWorkspaceRecycleOperation operation or a recycleURLs:completionHandler: message .

I don’t know how well either one of them will work on symbolic links, but it's worth a try if you prefer not to deal with FSRef s.

+3
source

my retro futuristic approach

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) } 
0
source

Source: https://habr.com/ru/post/1310038/


All Articles