我正在做一个项目,其中我主要依赖创建文件时设置的扩展属性。但我在修改文件时遇到了问题。
实例:
当我编辑文件时Sublime Text
,所有扩展属性都保留,inode 值也与以前相同。但是当我在Gedit
,它会创建新文件而不是修改现有文件。因此 inode 值、用户定义/扩展属性不会被保留。
我发现这个问题是由于 Gedit 的复制行为造成的。但是有没有办法在使用 Gedit 时保留它们?
答案1
你就是不能。
这是文件系统运行方面的错误,也是 gedit 中的一个错误,需要报告。
问题是你想让文件自动更改,但除了写入两个文件并使用重命名进行原子文件交换之外没有其他办法。但不幸的是,大多数程序员不能很好地处理特殊情况,仍然认为文件是字节序列(由于文件稀疏,它在 unix 上从来都不是字节序列)。
所需要的是一个仅切换文件块指针的文件内容切换 API,但 Linux 拒绝这样做,因为大多数人认为 40 年前的设计已经足够好了。
Gedit 没有复制扩展属性肯定是个错误。但是这样就无法保留 inode(它是文件最重要的元数据之一,是文件的身份)。
大多数 KDE 工具通常不会创建交换文件,而只是截断并覆盖内容,因为现在保存过程中崩溃的情况并不常见。我认为这是最好的方法,因为它还可以保留 inode。