Доступен ли файл для открытия? - PullRequest
0 голосов
/ 23 декабря 2009

Короткая версия: я думаю, что слишком рано запрашиваю файл, но он притворяется, будто готов. Я что-то упустил?

Чуть более длинная версия: я записываю файлы на диск. Прежде чем я сделаю это, я должен добавить некоторые метаданные, включая новое имя файла. Как только пользователь закончил, экран исчезает, и программа записывает файл на диск. Затем пользователь может посмотреть список файлов. Этот список создается путем чтения содержимого папки. Новый файл находится в списке файлов, но когда я пытаюсь извлечь информацию из файла для отображения (например, размер файла), происходит сбой программы. Насколько я могу судить, сбой происходит потому, что, хотя файл указан в имени, он недоступен для чтения. (Кстати, это небольшие файлы - несколько сотен тысяч).

Во-первых, возможно ли, что файл появляется в каталоге, но еще не все там? И во-вторых, если это так, как я могу проверить, готов ли файл для чтения?

Большое спасибо.

UPDATE:

Спасибо. Я постараюсь добавить больше информации. Я записываю аудиофайл с помощью AVAudioRecorder. Строка инициализации:

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

Программа проходит обновления и учет пользовательского интерфейса и все такое. Когда звук останавливается, я звоню:

[soundrecording stop];

и когда все остальное обновляется и готово двигаться дальше, я звоню:

[soundrecording release];
soundrecording=NULL;

Насколько я понимаю, это должно позаботиться о выпуске файла, да?

Еще раз спасибо.

Ответы [ 2 ]

1 голос
/ 23 декабря 2009

Первое, что я хотел бы сделать, это подтвердить, что вы правы относительно того, что файл еще не готов. Чтобы сделать это, спите свою программу на секунду или две после записи и перед чтением. Несколько сотен килобайт не должны занимать больше времени, чем готово.

Если это все равно не удается, я предполагаю, что вы не закрыли дескриптор файла, который использовали для его записи. Возможно, он не готов к чтению, поскольку файловая система считает, что вы можете продолжать запись.

Обычно, чтобы проверить, готов ли файл, нужно попытаться открыть его. Если это удастся, вы можете прочитать это. Или, если это не с ошибкой, вы можете изящно обработать ошибку:

  • В утилите командной строки вы можете распечатать ошибку и выйти, а пользователь может повторить попытку.
  • Если это фоновая программа, которая не должна закрываться, как сервер, вы можете зарегистрировать ошибку. Вы также можете повторить попытку автоматически после задержки. Если это серьезная ошибка, возможно, вы захотите, чтобы программа сообщала вам об этом по электронной почте.
  • В оконном приложении с графическим интерфейсом вы, вероятно, захотите показать диалоговое окно или панель ошибок, а затем дать пользователю возможность повторить попытку.
0 голосов
/ 23 декабря 2009

Теперь, когда вы добавили пример кода, я могу сказать еще немного.

Во-первых, ссылка на класс , похоже, говорит о том, что метод stop закроет файл. Тем не менее, это также, похоже, предполагает, что происходит базовый аудио сеанс и, возможно, некоторое преобразование. Мне кажется, я вспоминаю, что приложение для голосовых заметок iPhone, которое, вероятно, использует этот API, должно выполнить некоторую работу для сжатия длинной записи после ее завершения.

Так что я поддерживаю вашу догадку. Я думаю, что ваш файл может быть еще не закрыт, но в другом потоке, который обрабатывает записанные данные в надлежащий формат для сохранения.

Возможно, вы захотите установить NSTimer, чтобы пытаться открывать файл каждую секунду или около того, чтобы ваш пользовательский интерфейс мог оживиться, когда это будет сделано. Возможно, вы хотите показать сообщение типа «Пожалуйста, подождите» или сообщить пользователю, что оно работает.

...