سؤال

لا أرى أي خيارات ل 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 .
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

انقل الرابط إلى القمامة

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 .
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 ] $

كيف يمكنني نقل Symlinks إلى القمامة؟


الحل .. بفضل روب نابير

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);
هل كانت مفيدة؟

المحلول

يستخدم FSPathMakeRefWithOptions() لإنشاء FSREF إلى الرابط. ثم استخدام FSMoveObjectToTrashSync() لحذفه.

نصائح أخرى

الطريقة الأخرى هي إخبار Nsworkspace بـ "إعادة تدويرها" ، عن طريق إرسالها أيضًا أ performFileOperation:source:destination:files:tag: رسالة مع ال NSWorkspaceRecycleOperation عملية أو أ recycleURLs:completionHandler: رسالة.

لا أعرف مدى نجاح أي واحد من هؤلاء سيعملان على Symlinks ، لكن الأمر يستحق المحاولة إذا كنت تفضل التعامل معه FSRefس.

نهايتي الرجعية

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)
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top