android - 父目录的fsync是否保证所有递归子目录的元数据同步?

标签 android linux native ext4 fsync

目前我正在编写一个 Android 应用程序,需要在 native 端处理大量文件。

最近,我在更新或重命名这些文件时遇到了一些数据丢失或不一致的问题。 (所有这些文件都存储在公共(public)父/根目录的几个子目录中。)

阅读了几篇有关 fsync() 的文章后,我决定使用它。 但是我有一点不清楚:

在父目录上调用 fsync() 是否能保证所有子目录的元数据递归同步?

也就是说,假设我对公共(public)父目录中不同子目录中的多个文件进行了大量重命名操作。

那么我应该分别在每个子目录上调用 fsync() 还是在父目录上调用 fsync() 就足以确保所有子目录(及其递归子目录)的元数据与物理同步设备?

基本上,这个想法是通过避免多次 fsync() 调用来节省时间。或者与每个子目录上的 fsync() 相比,顶级目录上的 fsync() 会花费更多时间吗? (假设顶级目录上的fysnc()同步所有子目录元数据)

最佳答案

当对目录调用 fsync 时,该操作将其目标视为文件而不是文件容器。从文件系统的角度来看,目录是一种特殊的文件,它恰好包含有关其他文件的元数据。当 fsync 应用于目录时,有关所包含文件的元数据将被同步,但子目录/文件本身不会同步。

如果您想确保所有内容都正确同步,那么您应该显式地同步它们。

关于android - 父目录的fsync是否保证所有递归子目录的元数据同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17616485/

相关文章:

android - 使用 String 类型的 Switch 语句

java - 怎么解决?。线程 "main"java.lang.UnsatisfiedLinkError : Can't find dependent libraries 中出现异常

java - 如何使用SharedPreferences保存edittext中输入的文本并在另一个Activity中的TextView中显示

java - 命令: "DELETE FROM Table where ..." doesn't work

android - 如何在 Activity 的必填字段中显示 * 符号

c++ - CMake:如何使用 make 命令创建文件

sql - 如何在postgresql中指定登录角色(用户)

asp.net - 在 ubuntu 20.04 上安装 dotnet 4.7.2

.net - 将 .NET ushort[] 数组作为 uint16_t* 访问,无需复制

c# - P/Invoke 更改传递参数的值