2011-08-26 5 views
1

나는 이미지를 캡처 할 수있는 비디오 컨트롤이있는 블랙 베리 앱을 개발 한 다음 루트 디렉토리에 이미지를 저장하고 원하는 이름으로 이미지를 저장합니다. 화면 ... 다시 캡처 버튼을 클릭하면 다시 한번 이미지를 캡처하고 이전 이미지를 삭제하고 파일 연결을 사용하여 같은 경로에 같은 이름으로 새 이미지를 저장합니다. 내 문제는 에뮬레이터에서 잘 작동합니다. 그러나 장치에서 테스트 할 때 새 이미지를 저장하기 위해 이전 이미지를 삭제하려고하면 오류가 발생합니다 .. "net.rim.device.api.io.file.fileioexception : 파일이 현재 사용 중입니다" .. @juanmabaiu 이것은 잡아 가고 장치에서 테스트 할 때 예외를 throw하는 기능입니다, 파일 연결을 사용하여 SD 카드의 파일을 삭제할 수 있습니다 - Blackberry


이 @arhimed .. 저를 도와주세요.

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"); 
    }   
} 
+0

파일을 저장하거나 삭제 한 후에 스트림을 닫아야합니다. –

+0

위의 코멘트에서 Arhimed가 말한 것을 시도해보십시오. 문제가 해결되지 않으면 코드를 추가하십시오. –

+0

안녕하세요 arhimed 및 juanmabaiu .. 모든 것이 코드에서 잘됩니다. 에뮬레이터에서 완벽하게 작동합니다. 장치에서 테스트했을 때 오류가 표시됩니다 .. –

답변

1

이 코드 조각은 냄새입니다 :

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

파일이 존재하는 경우에 실제로, 당신은 그것을 삭제,하지만 당신은 단지 삭제 된 파일에 대한 FileConnection 예를 잊어. 나는 이것이 이유 일 수 있다고 생각한다. FileConnection 인스턴스를 즉시 닫아야합니다.

마찬가지로

은, 파일이나 디렉토리가 FileConnection.delete() 메소드를 사용하여 삭제 할 수 있으며, 개발자는 비에 대한 연결을 액세스 예외를 방지하기 위해 삭제 후 즉시 연결을 종료해야합니다 여기 BB API 이것에 대해 말하는 것입니다 존재하는 파일 또는 디렉토리.

그래서 다음 사용하려고 :

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

다른 점을 강조 코드가 매우 자신감 낙관적 /, 제대로 처리하지 않습니다 코너 케이스 것입니다. 예 : out.write(_raw);이 무엇 때문에 실패했는지 (예 : 사용 가능한 여유 공간 없음)? FileConnection과 OutputStream을 닫을 수 있습니까? 아니요. finally 블록을 추가해야 실제로 실제로 아무 것도 열어 두지 않을 것입니다.

+0

답장을 보내 주셔서 감사합니다. 나는 네가 한 말을 시험해 보았다. 하지만 여전히 같은 문제에 직면하고 있습니다. –

+0

뭔가가 해당 파일의 시스템 리소스를 확실히 보유하고 있습니다. 정확히 무엇을하는지 알아 내려고 노력하십시오. –

+0

위의 if 루프는 에뮬레이터에서 완벽하게 작동하고 장치에서 예외를 throw합니다. 원하는 경우 전체 코드를 메일로 보낼 수 있습니다. 이 문제에 대해 저를 도울 수 있습니까? –

2

나는 또한이 문제에 직면하고 있지만 SDcard가 아닌 장치 메모리에 이미지를 저장하려고 시도했습니다. 다음 코드는 이미지를 삭제할 수 있습니다.

if (file.exists()) { 
    file.delete(); 
    file.close(); 
} 
관련 문제