Pregunta

Versión corta: Creo que estoy pidiendo un archivo demasiado pronto, pero está fingiendo como si estuviera listo. Me estoy perdiendo algo?

Es algo más larga versión: Estoy escribiendo archivos en el disco. Antes de hacerlo, tengo que el usuario añada algunos metadatos, incluyendo el nuevo nombre de archivo. Una vez que se realiza el usuario, la pantalla desaparece y el programa escribe el archivo en el disco. El usuario puede entonces mirar a una lista de archivos. Esa lista se genera mediante la lectura de los contenidos de una carpeta. El nuevo archivo se encuentra en la lista de archivos, pero cuando intento de extraer información a partir del archivo para que aparezca (por ejemplo, tamaño de archivo) se bloquea el programa. Lo mejor que puedo decir, el accidente se produce porque, mientras el archivo está allí en nombre, que no está disponible para ser leído. (Por cierto, estos son pequeños archivos -. Unos pocos cientos k)

En primer lugar, ¿es posible que un archivo aparece en el directorio, pero no es todo lo que hay todavía? una Y en segundo lugar, si es así, ¿cómo puedo comprobar para ver si el archivo está listo para ser leído?

Gracias mucho.

ACTUALIZACIÓN:

Gracias. Voy a tratar de añadir más información. Estoy grabando un archivo de audio con AVAudioRecorder. La línea init es:

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

El programa pasa a través de su sistema de actualización y medición de interfaz de usuario y todo eso. Cuando se detiene el audio, que llamo:

[soundrecording stop];

y cuando todo lo demás está actualizado y listo para seguir adelante, que yo llamo:

[soundrecording release];
soundrecording=NULL;

Por lo que yo entiendo, esto debe hacerse cargo de soltar el archivo, sí?

Gracias de nuevo.

¿Fue útil?

Solución

Ahora que ha añadido código de ejemplo, puedo decir un poco más.

En primer lugar, los href="http://developer.apple.com/iphone/library/documentation/AVFoundation/Reference/AVAudioRecorder_ClassReference/Reference/Reference.html" parece decir que el método stop se cerrará el archivo. Sin embargo, también parece sugerir que hay una sesión de audio subyacente pasando, y posiblemente alguna conversión. Creo que recordar que la aplicación Notas de voz del iPhone, lo que probablemente utiliza esta API, tiene que hacer un trabajo para comprimir una grabación de larga duración después de que haya terminado.

Así que apoyo su corazonada. Creo que el archivo no puede ser cerrado todavía, pero en otra hebra que procesa los datos grabados en un formato adecuado para guardar.

Es posible que desee establecer un NSTimer para intentar abrir el archivo cada segundo más o menos, de modo que su interfaz de usuario puede animarse cuando esté hecho. Es posible que desee mostrar un "Por favor espere" tipo de mensaje en el ínterin, o de otra manera que el usuario sepa que está funcionando.

Otros consejos

Lo primero que me gustaría hacer es confirmar que tienes razón sobre el archivo no estar listo todavía. Para hacer eso, dormir su programa para un segundo o dos después de haber escrito y antes de la lectura. Unos pocos cientos de KB no debe tardar más de lo que estar preparado.

Si el error persiste, mi conjetura es que no se haya cerrado el identificador de archivo que utilizó para escribir en él. Puede ser no está preparado para la lectura debido a que el sistema de archivos cree que usted podría seguir escribiendo.

Por lo general, la forma de comprobar para ver si un archivo está listo es intentar abrirlo. Si que tiene éxito, puede leerlo. O si se produce un error, se puede controlar el error con gracia:

  • En una utilidad de línea de comandos, es posible imprimir el error y dejar de fumar, y el usuario podría intentar de nuevo.
  • Si se trata de un programa en segundo plano que no debe dejar de fumar, como un servidor, se puede registrar el error. También puede tratar de nuevo de forma automática después de un retraso. Si se trata de una gran cantidad de tipo de error, es posible que desee que el programa le envía por correo electrónico al respecto.
  • En una aplicación ventana de interfaz gráfica de usuario, es probable que desee para mostrar un diálogo de error o panel y, a continuación, dar al usuario la oportunidad de volver a intentar.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top