2014-09-30 40 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 2014-09-30 11:25:17

+0

崩潰可能是由於應用程序錯誤,但也可能是由於設備關機(低電量,關鍵設備故障)。 – flchaux 2014-09-30 12:55:17

回答

2

由於程序異常終止,緩衝區可能無法刷新到文件。

爲了防止出現這種情況,請在每次寫入(關閉流或關閉文件描述符)後刷新文件,然後使用append重新打開文件。

從經驗來看,ext文件系統(比如來自Android的ext文件系統)比NTFS使用的是磁盤緩存(稍後刷新而非更快)。

+0

我將copyFile函數發佈到我的問題中。看起來文件寫入後正確關閉。你認爲這樣可以嗎? – flchaux 2014-09-30 12:35:38

+0

這看起來像Java代碼,你使用JNI進行文件傳輸嗎?您正在使用Java正確關閉流 - 仍然不保證在硬盤上刷新。嘗試使用stdio(fprintf和fscanf)實現複製文件。關於你的應用程序的一些問題:你確定java收到的路徑是正確的嗎?你有什麼例外嗎?複製文件中應用程序崩潰了嗎?您正在複製的文件是否爲空? – MichaelCMS 2014-09-30 12:58:37

+0

是的,我正在使用JNI。 (寫作) – flchaux 2014-09-30 13:20:13