Pergunta

Versão curta: acho que estou pedindo um arquivo muito cedo, mas está fingindo que está pronto. Estou esquecendo de algo?

Versão um pouco mais longa: estou escrevendo arquivos no disco. Antes de fazer isso, tenho o usuário adicionar alguns meta -dados, incluindo o novo nome do arquivo. Depois que o usuário terminar, a tela desaparece e o programa grava o arquivo no disco. O usuário pode analisar uma lista de arquivos. Essa lista é gerada lendo o conteúdo de uma pasta. O novo arquivo está na lista de arquivos, mas quando tento extrair informações do arquivo para exibir (por exemplo, tamanho do arquivo), o programa trava. Da melhor maneira possível, o acidente ocorre porque, enquanto o arquivo está em nome, não está disponível para ser lido. (A propósito, esses são arquivos pequenos - algumas centenas de k.)

Primeiro, é possível que um arquivo apareça no diretório, mas ainda não está tudo lá? A e segundo, se sim, como faço para verificar se o arquivo está pronto para ser lido?

Muito obrigado.

ATUALIZAR:

Obrigado. Vou tentar adicionar mais informações. Estou gravando um arquivo de áudio com a AvaudiorCorder. A linha init é:

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

O programa passa por suas atualizações de interface do usuário e medição e tudo mais. Quando o áudio é interrompido, eu chamo:

[soundrecording stop];

E quando todo o resto é atualizado e pronto para seguir em frente, eu chamo:

[soundrecording release];
soundrecording=NULL;

Até onde eu entendo, isso deve cuidar do lançamento do arquivo, sim?

Obrigado novamente.

Foi útil?

Solução

Agora que você adicionou código de amostra, posso dizer um pouco mais.

Primeiro, o Referência de classe parece dizer que o stop Método fechará o arquivo. No entanto, também parece sugerir que existe uma sessão de áudio subjacente e possivelmente alguma conversão. Acho que me lembro que o aplicativo de notas de voz do iPhone, que provavelmente usa essa API, precisa fazer algum trabalho para comprimir uma longa gravação após a conclusão.

Então, eu apoio seu palpite. Eu acho que seu arquivo ainda não está fechado, mas em outro thread que está processando os dados gravados em um formato adequado para salvar.

Você provavelmente quer definir um NSTimer tentar abrir o arquivo a cada segundo, para que sua interface do usuário possa se animar quando estiver concluída. Enquanto isso, você deseja mostrar um tipo de mensagem "Aguarde" ou informe o usuário que está funcionando.

Outras dicas

A primeira coisa que eu faria é confirmar que você está certo sobre o arquivo ainda não estar pronto. Para fazer isso, durma seu programa por um segundo ou dois depois de escrever e antes de ler. Algumas centenas de kb não devem demorar mais do que isso para estar pronto.

Se ainda falhar, meu palpite é que você não fechou o identificador de arquivo que costumava escrever. Pode não estar pronto para ler, porque o sistema de arquivos pensa que você pode continuar escrevendo.

Geralmente, a maneira de verificar se um arquivo está pronto é tentar abri -lo. Se isso for bem -sucedido, você pode lê -lo. Ou, se falhar com um erro, você pode lidar com o erro graciosamente:

  • Em um utilitário de linha de comando, você pode imprimir o erro e sair, e o usuário pode tentar novamente.
  • Se for um programa de fundo que não deve sair, como um servidor, você pode registrar o erro. Você também pode tentar novamente automaticamente após um atraso. Se for um grande problema, convém que o programa envie um e -mail sobre ele.
  • Em um aplicativo de janela da GUI, você provavelmente deseja mostrar uma caixa de diálogo ou painel de erro e, em seguida, dar ao usuário a oportunidade de tentar novamente.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top