2014-09-30 7 views
0

기기의 일부 파일에 사용자 데이터를 저장하는 게임을하고 있습니다. 게임이 충돌 한 후 사용자는 이러한 데이터를 검색하지 않습니다. 충돌 직후 해당 파일이 비어 있습니다. 또한 아래에 백업 파일이 만들어져 새 데이터가 저장되므로 이전 데이터가 삭제되지 않습니다. 이 백업 파일도 비어 있습니다.Android - 충돌 후 파일이 비어졌습니다.

나는 어떻게 비워 질 수 있는지 이해하지 못한다. 당신은 저장 기능을 검색 할 수 있습니다

알고리즘 형태 :

copy file to file_backup 
if save data to file_temp then 
    move file_temp to file 
else 
    delete file_temp 

C++ 형태 : 당신이 어떤 생각을 가지고있는 경우

const std::string path = "dataPlayer.dat"; 
const std::string backupPath = atPath + "_back"; 

if (PlatformInterface::fileExists(path)) 
{ 
    if (PlatformInterface::fileExists(backupPath)) 
     PlatformInterface::removeFile(backupPath); 
    PlatformInterface::copyFile(path, backupPath); 
} 

const std::string tempPath = path + "_temp"; 
// Save in compact form. 
XMLError error = dataDocument.SaveFile(tempPath.c_str(), true); 
if (error != XML_NO_ERROR) 
{ 
    PlatformInterface::removeFile(tempPath); 
} 
else 
{ 
    bool moved = PlatformInterface::moveFile(tempPath, path); 
    if (!moved) 
    { 
     PlatformInterface::removeFile(tempPath); 
    } 
} 

내가 당신을 감사합니다!

편집 : PlatformInterface :: CopyFile 수 (경로, backupPath) 방법 :

public static void copyFile(final String path, final String destination) { 
    try { 
     if (!new File(path).exists()) 
      return; 
     InputStream in = new FileInputStream(path); 
     OutputStream out = new FileOutputStream(destination); 
     // Transfer bytes from in to out 
     byte[] buf = new byte[1024]; 
     int len; 
     while ((len = in.read(buf)) > 0) { 
      out.write(buf, 0, len); 
     } 
     in.close(); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

파일이 제대로 닫혀있는 것 같다.

+0

중요한 것은 : 왜 충돌이 발생하고이를 방지 할 수 있습니까? – Opiatefuchs

+0

크래시가 앱 오류로 인한 것일 수 있지만 장치 종료 (배터리 부족, 중요한 장치 오류) 때문일 수 있습니다. – flchaux

답변

2

프로그램의 비정상적인 종료로 인해 버퍼가 파일로 플러시되지 않을 수 있습니다.

이 문제를 방지하려면 각 쓰기 후에 파일을 플러시 (스트림을 닫거나 파일 설명자를 fclose) 한 다음 append를 사용하여 다시여십시오.

경험상 ext 파일 시스템 (예 : 안드로이드)은 디스크 캐시를 NTFS 이상 사용합니다 (NTFS는 나중에 더 빨리 플러시합니다).

+0

copyFile 함수를 제 질문에 게시합니다. 서면 파일이 올바르게 닫힌 것 같습니다. 이게 괜찮은 것 같니? – flchaux

+0

이것은 자바 코드처럼 보입니다. 파일 전송을 위해 JNI를 사용하고 있습니까? Java에서 스트림을 올바르게 닫고 있습니다. 여전히 hdd가 플러시되지는 않습니다. stdio (fprintf 및 fscanf)로 복사 파일을 구현해보십시오. 앱과 관련된 몇 가지 질문 : java에서받은 경로가 맞습니까? 예외가 있습니까? 파일 복사 중 응용 프로그램이 충돌합니까? 복사하려는 파일이 비어 있습니까? – MichaelCMS

+0

예, JNI를 사용하고 있습니다. (쓰는) – flchaux

관련 문제