Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to move a symlink to the trash?

I don't see any options for the FSPathMoveObjectToTrashSync() function for not following links.

Here is what I have tried

Create a link and a 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 trash

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

Output is

status: 0

However the file got removed and 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 move symlinks to the trash?


The Solution.. thanks to 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);
like image 640
neoneye Avatar asked Feb 27 '23 00:02

neoneye


2 Answers

Use FSPathMakeRefWithOptions() to generate an FSRef to the link. Then use FSMoveObjectToTrashSync() to delete it.

like image 113
Rob Napier Avatar answered Mar 08 '23 01:03

Rob Napier


The other way would be to tell the NSWorkspace to “recycle” it, by sending it either a performFileOperation:source:destination:files:tag: message with the NSWorkspaceRecycleOperation operation or a recycleURLs:completionHandler: message.

I don't know how well either one of these would work on symlinks, but it's worth trying if you'd rather not deal with FSRefs.

like image 37
Peter Hosey Avatar answered Mar 08 '23 02:03

Peter Hosey