Не могу удалить файл на SD-карте, используя подключение к файлу - Blackberry - PullRequest
1 голос
/ 26 августа 2011

Я разработал приложение для BlackBerry, в котором у меня есть видео контроль для захвата изображения, затем я сохраняю изображения в корневом каталоге под моим желаемым именем и отображаю экран ... в кнопке повторного захвата нажмите, я снова снимаюизображение еще раз, и я удаляю предыдущее изображение и сохраняю новое изображение с тем же именем в том же пути, используя подключение к файлу.Моя проблема в том, что он отлично работает в эмуляторе.Но когда я проверил на устройстве, он выдает ошибку, когда я пытаюсь удалить предыдущее изображение, чтобы сохранить новое изображение .. он выдает «net.rim.device.api.io.file.fileioexception: файл в настоящее время используется».. пожалуйста, помогите мне ..


@ arhimed, @juanmabaiu Это функция, которая используется для отлова и исключения при тестировании на устройстве.

 public void fieldChanged( final byte[] _raw )
{
    try
    {    
        flag ++;
        // Create the connection to a file that may or
        // may not exist.
        FileConnection file = (FileConnection)Connector.open(FILE_NAME + "_front" + EXTENSION);

        // If the file exists, increment the counter until we find
        // one that hasn't been created yet.
        while( file.exists() )
        {
            file.delete();
            file = (FileConnection)Connector.open( FILE_NAME + "_front" + EXTENSION );
        }          

        //FileConnection file_temp = (FileConnection)Connector.open(FILE_NAME + "tempimg" + EXTENSION);
        //file_temp.delete();
        // We know the file doesn't exist yet, so create it
        file.create();

        // Write the image to the file
        OutputStream out = file.openOutputStream();
        out.write(_raw);

        // Close the connections
        out.close();
        file.close();
        //Dialog.inform( "Saved to " + FILE_NAME + "_front" + EXTENSION );
    }
    catch(Exception e)
    {
        home.errorDialog("ERROR " + e.getClass() + ":  " + e.getMessage());
        Dialog.inform( "File not saved this time");
    }        
}

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Я тоже сталкивался с этой проблемой, но когда я пытался сохранить изображение в памяти устройства, а не SDcard. Следующий код может удалить изображение:

if (file.exists()) {
    file.delete();
    file.close();
}
1 голос
/ 26 августа 2011

Этот кусок кода вонючий:

while( file.exists() )
{
    file.delete();
    file = (FileConnection)Connector.open( FILE_NAME + "_front" + EXTENSION );
}

На самом деле, если файл существует, вы его удаляете, но забыли об экземпляре FileConnection для только что удаленного файла. Я думаю, что это может быть причиной. Вам нужно немедленно закрыть экземпляр FileConnection. Вот что BB API говорит об этом:

Аналогичным образом, файлы или каталоги могут быть удалены с помощью метода FileConnection.delete (), и разработчики должны закрыть соединение сразу после удаления, чтобы исключить доступ к соединению с несуществующим файлом или каталогом.

Поэтому попробуйте использовать следующее:

if (file.exists()) {
    file.delete();
    file.close();
    file = (FileConnection) Connector.open(FILE_NAME + "_front" + EXTENSION);
}

Еще один момент, на который следует обратить внимание, - это то, что код очень самоуверенный / оптимистичный, он неправильно обрабатывает угловые случаи. Например. что если out.write(_raw); не получится по какой-либо причине (например, нет свободного места)? Будут ли закрыты FileConnection и OutputStream? Нет. Поэтому вам нужно добавить блок finally, чтобы убедиться, что вы на самом деле ничего не оставляете открытым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...