Android-崩溃后文件为空

Android-崩溃后文件为空,android,c++,android-ndk,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+

我正在制作游戏,将用户数据保存在设备上的一些文件中。游戏崩溃后,用户无法检索这些数据。崩溃后,相应的文件立即为空。此外,下面创建了一个备份文件来保存新数据,以确保旧数据不会被删除。此备份文件也是空的

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

算法形式:

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

文件似乎已正确关闭。

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

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


根据经验,ext文件系统(如Android文件系统)使用磁盘缓存的次数多于NTFS(它刷新的时间较晚,而不是更早)。

重要的是:为什么会崩溃以及如何防止崩溃。崩溃可能是由于应用程序错误,但也可能是由于设备关闭(电池电量不足,严重设备故障).我将copyFile函数发布到我的问题中。似乎文件在写入后已正确关闭。您认为这样可以吗?这看起来像Java代码,您是否使用JNI进行文件传输?您在Java中正确地关闭了流-仍然不能保证在hdd上刷新。尝试使用stdio(fprintf和fscanf)实现复制文件。关于你的应用的一些问题:你确定java收到的路径是正确的吗?你有例外吗?您的应用程序在复制文件时是否崩溃?您正在复制的文件是空的吗?是的,我正在使用JNI。(写作)是的,我正在使用JNI。我不确定java是否正确接收了路径。没有例外(碰撞是通过拆下电池产生的)。文件不是空的(通过USB检查)。我正在尝试使用FileChannel::force(true)、File::flush()和FileDescriptor::sync()方法。如果您在复制过程中使应用程序崩溃,则无论您如何关闭流(这是您试图实现的目标吗?),都会出现一无所有的情况。检查java路径(一个简单的println应该可以做到这一点),只是为了确定。