Écrire ce fichier ne fonctionne pas
J'essaie de combiner des images dans mon application dans un seul fichier et de les écrire sur le disque.
NSMutableArray *array = [NSMutableArray arrayWithObjects:
[NSData dataWithContentsOfFile:@"0.png"],
[NSData dataWithContentsOfFile:@"1.png"],
[NSData dataWithContentsOfFile:@"2.png"],
nil];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
NSError *error = nil;
NSString *path=@"/Users/myusername/Desktop/_stuff.dat";
[data writeToFile:path options:NSDataWritingAtomic error:&error];
ou
NSArray *array = [NSArray arrayWithObjects:
[NSImage imageNamed:@"0"],
[NSImage imageNamed:@"1"],
[NSImage imageNamed:@"2"],
nil];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
NSError *error = nil;
NSString *path=@"/Users/myusername/Desktop/_stuff.dat";
[data writeToFile:path options:NSDataWritingAtomic error:&error];
Mais à la fois de produire un fichier de 4 ko (vide). Si je NSLog
l'erreur, il est (null)
. Suis-je rendre les données dans le mauvais sens?
Edit: Si j'ouvre le fichier avec un éditeur de texte, il ressemble à ceci:
Vous ne devriez pas coder en dur le chemin comme ça. Utilisation
Merci pour l'astuce. C'est un temps d'utiliser le code que j'utilise pour regrouper les images dans un seul gros fichier uniquement pour mon usage personnel. Cependant, je vais garder cela à l'esprit!
[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/_stuff.dat"];
ou même [[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop"] stringByAppendingPathComponent:@"_stuff.dat"];
Merci pour l'astuce. C'est un temps d'utiliser le code que j'utilise pour regrouper les images dans un seul gros fichier uniquement pour mon usage personnel. Cependant, je vais garder cela à l'esprit!
OriginalL'auteur sudo rm -rf | 2011-03-02
Vous devez vous connecter pour publier un commentaire.
J'ai écrit un exemple rapide:
Manquant: gestion de la mémoire /d'erreur de manipulation ou de la bonne gestion des fichiers
Vous pouvez également ajouter NSImages à la NSMutableArray:
Mais qui va considérablement augmenter la taille du fichier.
Je suis heureux, il a travaillé 🙂
Donc, si j'ai seulement besoin d'accéder à une image au moment de l'exécution (dans les archives), il est un moyen d'accéder à cette image à un indice sans désarchivage l'ensemble de la chose? Semble comme une surcharge inutile pour moi.
Voir ma deuxième réponse (c'était trop long pour un commentaire).
OriginalL'auteur Anne
De réponse pour le commentaire suivant:
Donc, si j'ai seulement besoin d'accéder à une image au moment de l'exécution (dans les archives), il est un moyen d'accéder à cette image à un indice sans désarchivage l'ensemble de la chose? Semble comme une surcharge inutile pour moi.
Je suppose que vous êtes toujours aux prises avec ce problème?
Se cacher (ou chiffrement) les ressources de l'application?
Comme je l'ai mentionné plus tôt, en combinant tous les fichiers en un seul gros fichier fait le tour.
Juste assurez-vous que vous vous souvenez du fichier à longueur de chaque dossier et fichier-commande.
Ensuite, vous pouvez extraire n'importe quel fichier spécifique que vous aimez sans avoir à lire tout le fichier.
Ce serait peut-être plus suffisamment de chemin si vous avez seulement besoin d'extraire un seul fichier à la fois.
Rapide "sale" de l'échantillon:
Conseil:
Vous pouvez également enregistrer l'index à l'intérieur du conteneur de fichier.
Par exemple: Les 500 premiers octets contiennent les informations requises.
Lorsque vous avez besoin d'un fichier spécifique: Lecture de l'index, obtenir la position dans le fichier et l'extraire.
OriginalL'auteur Anne
Vous archivez un NSMutable tableau de NSImage. Ces deux classes sont conformes à la NSCoding protocole requis par NSKeyedArchiver, donc je ne vois pas où serait le problème.
Donc, voici de nombreuses idées à tester.
D'abord, êtes-vous sûr que les données que vous pensez que vous avez sont-ils valables? Dans votre premier extrait de code, vous écrivez
[NSData dataWithContentsOfFile:@"0.png"]
. Cette méthode attend un chemin absolu du fichier.En supposant que le problème n'est pas dans votre code, il vous suffit dans votre question, nous allons continuer:
Avez-vous quelque chose de différent de nil dans la variable de données après votre archivage? C'est à dire, après la déclaration de données, vous pouvez ajouter ce code. Si l'assertion échoue, vous aurez une exception à l'exécution:
Si le problème n'était pas là, qu'est-ce que le retour de la ligne
[data writeToFile:path options:NSDataWritingAtomic error:&error];
(Pas la variable d'erreur, mais la valeur de retour de l'appel à la méthode
- writeToFile: options: error:
)Ce qui se passe si vous simplifier votre code et il suffit de faire ceci:
Si tout était ok, avez-vous essayé de réactivation de votre fichier avec NSKeyedUnarchiver?
Merci pour ton edit, je vais essayer quand-je accéder à mon code plus tard aujourd'hui.
Vous avez fixé une partie de mon problème en me disant sur le chemin d'accès absolu. J'ai été en utilisant un chemin relatif, et il ne fonctionnait pas. Merci pour votre aide.
OriginalL'auteur Guillaume
Le problème est que
[NSData dataWithContentsOfFile:@"0.png"]
recherche le fichier "0.png" dans le répertoire courant, mais ce que l'application pense que le répertoire courant est probablement pas l'endroit que vous êtes enceinte. Pour les applications graphiques, vous devriez toujours utiliser un chemin absolu, soit un chemin relatif à un endroit que vous pouvez obtenir le chemin d'accès absolu (par exemple, votre application bundle, le répertoire application support, certains emplacement choisi par l'utilisateur).Pour les outils de ligne de commande, en utilisant le répertoire en cours est la plus courante. Mais je doute que c'est le cas ici.
OriginalL'auteur Chuck
Une autre chose que j'ai remarqué sur Mavericks et les est que les dossiers dans le chemin d'accès doit être dans l'existence. Ce qui signifie que vous devez créer le dossier de la structure avant de l'enregistrer dans ce dossier. Si vous essayez d'écrire dans un dossier sur le bureau ou ailleurs, même avec le bac à sable hors, il échouera si le dossier n'existe pas. Je sais que cela a déjà répondu, mais j'ai trouvé que mon problème continue, peu importe, mais une fois que j'ai assurez-vous que le dossier de la structure était en place, j'ai pu faire de mon écriture sur ce dossier.
Sur une note de côté: je suis sûr que vous pourriez faire à partir de NSFileManager, et je vais le faire moi-même une fois que j'ai finaliser mon app de la structure, mais espérons que cela aide quelqu'un d'autre a perdu dans la sauce.
OriginalL'auteur FrostyL