Un paquet n'est apparemment qu'un répertoire, mais le Finder et le Path Finder savent qu'il s'agit d'un paquet.
Comment cela est-il indiqué dans le système de fichiers ? J'ai essayé de modifier un répertoire pour en faire un paquet, mais en vain.
Un paquet n'est apparemment qu'un répertoire, mais le Finder et le Path Finder savent qu'il s'agit d'un paquet.
Comment cela est-il indiqué dans le système de fichiers ? J'ai essayé de modifier un répertoire pour en faire un paquet, mais en vain.
Réponse courte
Pour enregistrer un document en tant que paquet, le développeur de DayOne aurait dû modifier les informations relatives au type de document dans le fichier Info.plist de l'application DayOne.
Réponse longue
A paquet est un répertoire du système de fichiers utilisé par MacOS et iOS. Il s'agit essentiellement d'un répertoire qui apparaître comme un fichier unique, mais qui peut en fait contenir un état préservé de fichiers et de dossiers. Ainsi, un dossier peut contenir un certain nombre de sous-dossiers et de nombreux fichiers, mais en tant que paquet, il sera affiché aux utilisateurs comme un seul fichier. Par exemple, dans MacOS, le Finder verra un paquet comme un fichier unique pour éviter que les utilisateurs ne manipulent le contenu réel. Toutefois, les utilisateurs peuvent afficher le contenu par diverses méthodes, comme un clic droit sur le paquet et la sélection de Afficher le contenu du paquet dans le menu contextuel.
Apple's Guide de programmation de l'offre groupée disponible sur leur site Developer, comporte toute une section sur les paquets de documents. Voici quelques citations pertinentes :
T dans la liste des propriétés de l'information de votre application (
Info.plist
). Le fichierCFBundleDocumentTypes
k sur les types de documents pris en charge par votre application. Pour chaque type de inclure la cléLSTypeIsPackage
k appropriée. La présence de cette clé indique au Finder et aux services de lancement de traiter les répertoires ayant l'extension de fichier donnée comme un paquet. Pour plus plus d'informations sur lesInfo.plist
clés, voir I Référence de la clé .D même si cette extension peut être cachée par l'utilisateur. L'extension permet au Finder d'identifier votre répertoire de documents et de le document et de le traiter comme un paquet. Vous ne devez jamais associer un paquet de documents à un type MIME ou à un type OS de 4 octets.
Fuente: Guide de programmation de l'offre groupée
Au cas où vous ne pourriez pas accéder au document, faites-le moi savoir et j'inclurai quelques citations supplémentaires tirées de la page.
J'ai eu la même question et j'ai trouvé toutes les réponses loin d'être satisfaisantes. Voici mon point de vue (après 2 semaines de recherche).
La chose la plus importante à comprendre : MacOS (ainsi qu'iOS, iPadOS tvOS, watchOS) maintient certaines une base de données dynamique d'enregistrements Identificateurs universels de type . Je ne peux pas développer beaucoup ici - le sujet est vaste - mais je dirai qu'un UTI formel peut être associé à plusieurs "balises" (identifiants d'autres "espaces", comme par exemple --- un nom de fichier Extension.
Chaque fois qu'une nouvelle application arrive sur le système de fichiers Mac, le système d'exploitation consulte son Info.plist et ajoute à sa base de données les nouvelles définitions de type qu'il y trouve.
Le cadre MacOS responsable de la communication avec cette base de données est appelé LaunchServices
et j'ai vu que beaucoup de ses API sont obsolètes et doivent être remplacées par la nouvelle API UniformTypeIdentifiers
uniquement disponible à partir de MacOS Big Sur (11.x).
Ces cadres sont utilisés par le Finder, et tous les autres outils, pour déterminer le type de données à utiliser pour un fichier, un répertoire, un paquet, des données en mémoire, un objet à coller, etc.
Certains objets Cocoa de niveau supérieur ( NSURL
, NSFileManager
, NSWorkspace
et d'autres) s'articulent également autour de ces cadres, pour fournir des fonctionnalités liées aux types (par exemple, pour vous donner les URL des applications qui peuvent ouvrir un type de données spécifique, ou pour savoir si un fichier/répertoire est en fait le paquetage d'un document, ou pour avoir une idée éclairée d'un fichier pour lequel vous n'avez PAS d'application sur votre Mac).
Pour répondre directement à la question de l'OP - je n'ai pas été en mesure (même en regardant au niveau du noyau) de trouver un "package bit" ou un "bundle bit" que vous pouvez définir pour un répertoire - mais MÊME S'IL EXISTE, il ne déterminera pas le comportement du système d'exploitation vis-à-vis d'un répertoire. C'est toujours LaunchServices qui est consulté en la matière.
Une autre distinction importante est celle qui existe entre un L'offre groupée et un Paquet . Un "paquet" est un objet du système de fichiers (fichier, répertoire, alias, etc.) qui doit être présenté et manipulé comme s'il s'agissait d'un seul objet (fichier document). Si quelque chose repose sur le mystérieux "bundle bit" --- c'est l'aspect "Package" d'un répertoire/fichier/quoi que ce soit.
A " L'offre groupée "est une STRUCTURE FORMELLE d'un répertoire, comprenant un Info.plist avec les entrées requises, et d'autres éléments (tels que des applications, des extensions de noyau, des plugins, etc. peut être un paquet (comme .app) ou non (comme .framework).
Je ne sais pas si la question de l'OP provient de ses besoins de développement, mais je fournirai ici quelques API connexes qui peuvent être utiles.
BOOL isPackage = [[NSWorkspace sharedWorkspace] isFilePackageAtPath:_filePath ]; // will only help with EXISTING path. DO READ the documentation in the header for this method.
NSURL *fileURL = [NSURL fileURLWithPath:_documentPath isDirectory:YES];
NSError *error = nil;
NSNumber *value = nil;
isPackage = ([fileURL getResourceValue:&value forKey:NSURLIsPackageKey error:&error] && [value boolValue]); // a more powerful alternative - read header for more "resource keys" you can use in this method - e.g. for determining content-type and not only the package. Again, this is meant to be used for existing files/directories.
// this one is lower-level Core-Foundation tool that will work for non-existing objects - a "what if" question to LaunchServices.
CFArrayRef types = UTTypeCreateAllIdentifiersForTag( kUTTagClassFilenameExtension, (__bridge CFStringRef _Nonnull)(_filenameExtension), kUTTypePackage);
CFIndex typeCount = CFArrayGetCount(types);
switch (typeCount) {
case 0: _isDocument = NO; break; // no package UTI with this filename extension is known to LaunchServices.
case 1: {
CFStringRef type = CFArrayGetValueAtIndex(types, 0);
isPackage = ! CFStringHasPrefix(type, CFSTR("dyn.")); // LaunchServices may synthesize a dynamic UTI when it doesn't know a filename extension.
break;
}
default: isPackage = YES; break;
}
CFRelease(types);
Comme j'ai créé une application basée sur les documents pour MacOS, je peux vous aider à comprendre un peu. Bien que la réponse de @Monomeeth soit juste, l'utilisation d'une interface graphique est bien meilleure que celle de Info.plist
. Les gens empruntent généralement un autre chemin. Ils sous-classe NSDocment
qui sert de base à l'enregistrement et au chargement des fichiers et des lots. Ensuite, les gens vont dans Xcode et sous l'onglet "General", définissent un type de document, puis vont à "Exported UTIs" et exportent un UTI qui est conforme à com.apple.package
. Ils se lisent dans le NSFileWrapper
classe. De cette façon, les gens n'auront pas à faire un travail fastidieux avec des choses comme NSData
.
Si vous souhaitez créer une liasse, cochez la case suivante cette réponse . Il suffit de créer une application MacOS vide et de modifier les sections "UTIs exportées" à votre convenance.
LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.