Android - 崩溃后文件为空

时间:2014-09-30 11:03:03

标签: android c++ android-ndk

我正在处理我的游戏,它将用户数据保存在设备上的某些文件中。在游戏崩溃后,用户不会检索这些数据。崩溃后,相应的文件立即为空。此外,下面创建备份文件以保存新数据,以确保不删除旧数据。此备份文件也是空的。

我不明白他们怎么可能是空的。 您可以在下面找到保存功能:

算法形式:

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(path,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();
    }
}

该文件似乎已正确关闭。

1 个答案:

答案 0 :(得分:2)

由于程序异常终止,缓冲区可能无法刷新到文件中。

为了防止这种情况,请在每次写入后刷新文件(关闭流或关闭文件描述符)并使用append重新打开它。

根据经验,ext文件系统(如Android中的那个)使用的磁盘缓存比NTFS更多(它会在以后刷新而不是更快)。