2009-12-23 8 views
0

Version courte: Je pense que je demande un fichier trop tôt, mais il prétend que c'est prêt. Est-ce que je manque quelque chose?Un fichier est-il disponible pour être ouvert?

Version légèrement plus longue: J'écris des fichiers sur le disque. Avant cela, l'utilisateur ajoute des méta-données, y compris le nouveau nom de fichier. Une fois que l'utilisateur a terminé, l'écran disparaît et le programme écrit le fichier sur le disque. L'utilisateur peut alors regarder une liste de fichiers. Cette liste est générée en lisant le contenu d'un dossier. Le nouveau fichier figure dans la liste des fichiers, mais lorsque j'essaie d'extraire des informations du fichier à afficher (par exemple la taille du fichier), le programme se bloque. Le mieux que je puisse dire, l'accident se produit parce que, tandis que le fichier est là dans le nom, il n'est pas disponible pour être lu. (En passant, ce sont de petits fichiers - quelques centaines de k.)

Tout d'abord, est-il possible qu'un fichier apparaisse dans le répertoire mais n'est pas encore là? a Et deuxièmement, si oui, comment vérifier si le fichier est prêt à être lu?

Merci beaucoup.

MISE À JOUR:

Merci. Je vais essayer d'ajouter plus d'informations. J'enregistre un fichier audio avec AVAudioRecorder. La ligne d'init est:

soundrecording = [[AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error]; 

Le programme passe par ses mises à jour et ses compteurs d'interface utilisateur et tout ça. Lorsque le son est arrêté, je l'appelle:

[soundrecording stop]; 

et quand tout le reste est mis à jour et prêt à passer, je l'appelle:

[soundrecording release]; 
soundrecording=NULL; 

Pour autant que je comprends, cela devrait prendre soin de libérer le fichier, oui?

Merci encore.

+0

Qu'est-ce que cela a à voir avec Objective-C? Vous ne nous avez pas dit quel genre de crash vous avez, et comment vous essayez d'obtenir la taille du fichier. Si vous voulez de l'aide, vous devez nous en dire plus que votre hypothèse. – dreamlax

+1

Cette question et ses réponses pourraient être plus utiles à tout le monde, si vous souhaitez poster un échantillon de votre code, et indiquer où l'erreur se produit. –

+0

Merci. J'ai ajouté plus d'informations ci-dessus. –

Répondre

0

Maintenant que vous avez ajouté un exemple de code, je peux en dire plus.

D'abord, le class reference semble indiquer que la méthode stop fermera le fichier. Cependant, il semble également suggérer qu'il y a une session audio sous-jacente en cours, et éventuellement une conversion. Je pense que je me souviens que l'application Voice Notes de l'iPhone, qui utilise probablement cette API, doit faire un peu de travail pour compresser un long enregistrement une fois qu'il est terminé.

Donc, je soutiens votre intuition. Je pense que votre fichier ne peut pas encore être fermé, mais sur un autre thread qui traite les données enregistrées dans un format approprié pour enregistrer.

Vous souhaiterez probablement définir un NSTimer pour tenter d'ouvrir le fichier toutes les secondes, de sorte que votre interface utilisateur puisse s'intercaler une fois l'opération terminée. Vous voulez probablement afficher un message "Veuillez patienter" entre temps, ou laissez l'utilisateur savoir que cela fonctionne.

+0

Merci. Il semble que le fichier ne soit pas publié. Après que le AVAudioRecorder est arrêté et libéré et que l'utilisateur appelle le menu, j'ai: \t NSString * filePath = [[NSBundle mainBundle] pathForResource: nomFichier deType: @ "wav" inDirectory: @ "../ Documents"] ; \t while ([[NSFileManager defaultManager] isReadableFileAtPath: filePath] == NON) { \t \t NSLog (@ "prêt?"); \t \t [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 1]]; \t} Et c'est juste assis là à imprimer "prêt?" pour toujours. Une idée comment je peux traquer ce qui tient sur le fichier audio? Merci encore. –

+0

Peut-être qu'il n'est jamais écrit parce que vous êtes accidentellement en dehors du bac à sable. Essayez d'obtenir le dossier Documents de la manière canonique: NSArray * paths = NSSearchPathForDiriesiesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString * documentsDirectory = [chemins objectAtIndex: 0]; –

+0

Merci. Je sais que les fichiers sont en cours d'écriture car après le crash, je rouvre l'application et les fichiers sont là. En attendant, j'ai remarqué que le nouveau fichier ne bloque que si j'ouvre la liste avant d'enregistrer un fichier. (c'est-à-dire ouvrir l'affichage de la liste (généralement pour supprimer le fichier précédent), fermer l'affichage de la liste, ouvrir l'affichage des enregistrements, enregistrer un fichier, fermer l'affichage des enregistrements et ouvrir à nouveau la liste. cela signifie que le problème est de savoir comment je réutilise la vue liste. Je libère la liste chaque fois que je la ferme et je la recrée, donc je ne suis pas sûre de ce qui se passe. Quoi qu'il en soit, merci. –

1

La première chose que je ferais est de confirmer que vous avez raison sur le fait que le fichier n'est pas encore prêt. Pour ce faire, dormez votre programme pendant une seconde ou deux après avoir écrit et avant de lire. Quelques centaines de Ko ne devraient pas prendre plus de temps que cela pour être prêts.

Si cela échoue toujours, je suppose que vous n'avez pas fermé le handle de fichier que vous avez utilisé pour l'écrire. Il peut ne pas être prêt pour la lecture parce que le système de fichiers pense que vous pourriez continuer à écrire.

Habituellement, le moyen de vérifier si un fichier est prêt est de tenter de l'ouvrir. Si cela réussit, vous pouvez le lire. Ou, si cela échoue avec une erreur, vous pouvez gérer l'erreur avec élégance:

  • Dans un utilitaire de ligne de commande, vous pouvez imprimer l'erreur et quitter, et l'utilisateur peut réessayer.
  • S'il s'agit d'un programme d'arrière-plan qui ne doit pas se fermer, comme un serveur, vous pouvez enregistrer l'erreur. Vous pouvez également réessayer automatiquement après un délai. Si c'est un gros problème, vous voudrez peut-être que le programme vous envoie un courriel à ce sujet.
  • Dans une application de fenêtre GUI, vous souhaitez probablement afficher une boîte de dialogue ou un panneau d'erreur, puis autoriser l'utilisateur à réessayer.
+0

Ce serait ma conjecture. Accès en lecture refusé car il est toujours ouvert à l'écriture. –

+0

J'ai ajouté des informations plus spécifiques ci-dessus. –

Questions connexes