Verhindern von Resource Fork Files (._) beim Kopieren bzw. Löschen von Resource Fork Files mit NSFileManager?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Macoun 2019 - Frühbucherrabatt bis 26.7.2019

  • Verhindern von Resource Fork Files (._) beim Kopieren bzw. Löschen von Resource Fork Files mit NSFileManager?

    Ich kopieren per copyItemAtPath:toPath:error: Dateien auf ein Volume, welche mit FAT(32) formatiert ist. Da FAT(32) keine Metadaten für Files unterstützt legt macOS automatisch entsprechende Resource Fork Files (._xxx) beim Kopieren an.

    Diese Resource Fork Files würde ich

    a) beim Kopieren, wenn möglich, direkt verhindern oder
    b) nach dem Kopieren wieder löschen.

    Wenn ich mir nach dem Kopieren den Inhalt des Verzeichnisses per contentsOfDirectoryAtPath:error: oder contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error: geben lasse, dann werden die Resource Fork Files leider "herausgefiltert".

    Ich sehe aktuell keine Möglichkeit per NSFileManager mir die Resource Fork Files in einem Verzeichnis geben zu lassen, oder übersehe ich da eine Methode/Möglichkeit?

    Ok, per Terminal Befehl "ls -ail" oder dergleichen kann ich mir alle Dateien in einem Verzeichnis geben lassen, aber ich möchte ungern mit NSTask Terminal Befehle ausführen.

    Da die Resource Fork Files ja einen identischen Dateinamen mit dem Prefix "._" haben, lässt sich der Dateiname eines Resource Fork Files natürlich ermitteln und auf "gut Glück" ggf. löschen. Ich würde allerdings auch gerne mal "sehen" welche Resource Fork Files es wirklich in einem Verzeichnis gibt, um diese dann explizit löschen zu können. Quasi für ein "Clean up" für Resource Fork Files auf einem FAT(32) Volume.

    Hat da jemand Infos, Tipps etc. die mir ggf. weiterhelfen?
  • Mac & i Test Abo
  • Ganz dünnes Eis, aber ich versuche es trotzdem einmal:

    Könntest Du nicht mittels removexattr die Extended Attributes der Datei entfernen? Allerdings ist mir nicht ganz klar, (1.) wie Du die Attribute listen könntest und (2.) ob das in einer sandboxed App überhaupt zulässig ist ... also nur eine Idee zur weiteren Recherche :)

    Mattes

    Edit: Okay, für den ersten Punkt mag sich listxattr anbieten...
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Hm, removexattr und listxattr scheinen ja auch Terminal Befehle zu sein. Ich wollte ja eigentlich vermeiden mit NSTask zu hantieren.

    Beim Löschen von Dateien per NSFileManager werden die Resource Fork Files automatisch mit gelöscht. Dies ist schon mal positiv.

    Beim Kopieren schaue ich jetzt erst mal, ob es danach eine Datei mit "._" Präfix gibt und lösche diese dann. Ist nicht wirklich schön, aber funktioniert erst mal.

    Sollte noch jemand weitere Lösungen zur Vermeidung bzw. zum Ermitteln und Löschen von Resource Fork Files kennen, würde ich mich über einen Hinweis/Tipp sehr freuen. ;)
  • Mir war etwas langweilig und es hat mich interessiert, daher habe ich gerade selber etwas mit den Funktionen gespielt.
    • Disclaimer #1: Der Code ist "quick & dirty", mit nur rudimentärer Fehlerbehandlung etc.
    • Disclaimer #2: Ich fühle mich in C nicht wirklich wohl (shame on me), deshalb bin ich schnellstmöglich zu Objective-C zurückgekehrt
    Der Code ist schlicht: Auslesen der Länge aller Attributnamen einer übergebenen Datei, Auslesen der Attributnamen und Iterieren über dieselben. Dabei Löschen der Attribute:

    C-Quellcode: main.m

    1. #import <Foundation/Foundation.h>
    2. #import <sys/xattr.h>
    3. int main(int argc, const char * argv[])
    4. {
    5. @autoreleasepool
    6. {
    7. if (argc != 2)
    8. {
    9. NSLog(@"Parameter missing: File path to file which extended attributes will be removed.\n");
    10. exit(1);
    11. }
    12. NSLog(@"Removing extended attributes from %s\n", argv[1]);
    13. ssize_t bufferSize;
    14. bufferSize = listxattr(argv[1], NULL, 0, 0);
    15. if (bufferSize == -1)
    16. {
    17. NSLog(@"Error receiving extended attributes.");
    18. exit(2);
    19. }
    20. if (bufferSize == 0)
    21. {
    22. NSLog(@"No extended attributes found.");
    23. exit(4);
    24. }
    25. char *buffer = malloc(bufferSize);
    26. bufferSize = listxattr(argv[1], buffer, bufferSize, 0);
    27. NSData *attributesData = [NSData dataWithBytes:buffer length:bufferSize];
    28. free(buffer);
    29. NSString *attributesString = [[NSString alloc] initWithData:attributesData encoding:NSUTF8StringEncoding];
    30. NSArray *attributesArray = [attributesString componentsSeparatedByString:@"\0"];
    31. int returnCode = 0;
    32. for (NSString *attribute in attributesArray)
    33. {
    34. if (![attribute isEqualToString:@""])
    35. {
    36. if (removexattr(argv[1], [attribute UTF8String], 0) == 0)
    37. {
    38. NSLog(@"Attribute \"%@\" successfully removed.", attribute);
    39. }
    40. else
    41. {
    42. NSLog(@"Error removing attribute \"%@\".", attribute);
    43. returnCode = 8;
    44. }
    45. }
    46. }
    47. return returnCode;
    48. }
    49. }
    Alles anzeigen

    Zum Test habe ich einen Screenshot test.png auf meinem Schreibtisch abgelegt (diese enthalten ein paar erweiterte Attribute) und diese vor und nach dem Tool-Aufruf per xattr ausgegeben. Das sieht im Terminal dann so aus:

    Quellcode

    1. MattesBook:Desktop matthias$ xattr test.png
    2. com.apple.FinderInfo
    3. com.apple.lastuseddate#PS
    4. com.apple.metadata:kMDItemIsScreenCapture
    5. com.apple.metadata:kMDItemScreenCaptureGlobalRect
    6. com.apple.metadata:kMDItemScreenCaptureType
    7. MattesBook:Desktop matthias$ ./rmxattr test.png
    8. 2019-02-22 14:26:21.254 rmxattr[34703:3434263] Removeing extended attributes from test.png
    9. 2019-02-22 14:26:21.254 rmxattr[34703:3434263] Attribute "com.apple.FinderInfo" successfully removed.
    10. 2019-02-22 14:26:21.254 rmxattr[34703:3434263] Attribute "com.apple.lastuseddate#PS" successfully removed.
    11. 2019-02-22 14:26:21.254 rmxattr[34703:3434263] Attribute "com.apple.metadata:kMDItemIsScreenCapture" successfully removed.
    12. 2019-02-22 14:26:21.254 rmxattr[34703:3434263] Attribute "com.apple.metadata:kMDItemScreenCaptureGlobalRect" successfully removed.
    13. 2019-02-22 14:26:21.254 rmxattr[34703:3434263] Attribute "com.apple.metadata:kMDItemScreenCaptureType" successfully removed.
    14. MattesBook:Desktop matthias$ xattr test.png
    15. MattesBook:Desktop matthias$
    Alles anzeigen
    Schön ist vielleicht anders, aber so könnte man die erweiterten Attribute einer Datei ohne externer Task löschen ... und nach meinem Verständnis würde dann auch die versteckte Datei auf FAT-formatierten Medien wegfallen.

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MyMattes () aus folgendem Grund: calloc durch malloc ersetzt, Typos.