① 规则
- 支持文件夹级别的xattr设置,文件夹内部递归继承父目录xattr。
- 若文件自身xattr与父目录xattr冲突,则以文件自身xattr为准。
② 具体的理解
文件夹内部递归继承父目录xattr:如果
/test
目录压缩的xattr对应为true,/test
目录下所有的文件和子文件夹下的文件,都应该被压缩?在create文件时,文件本身是不存在xattr的,这时需要查找父目录是否具有xattr。疑问:查找父目录的xattr查找到哪一级,是
一直遍历找到具有xattr的那级目录
,还是只需遍历直接父目录
?文件被创建后,原本存在的目录为
/test
,该文件所在路径为/test/mkdir/1.txt
,这样的话/test/mkdir
是一个新建的目录。如果/test
文件夹具有xattr,设置/test/mkdir
和/test/mkdir/1.txt
的的xattr与/test一致,还是只需设置/test/mkdir/1.txt
的xattr?如果/test/mkdir和/test/mkdir/1.txt是级联创建的,在创建/test/mkdir时,他就继承/test的xattr,到/test/mkdir/1.txt时,他就只需遍历父目录即可。
③ 目前的构想
- 文件夹内部递归继承父目录xattr:如果
/test
目录压缩的xattr对应为true,/test
目录下所有的文件和子文件夹下的文件,都应该被压缩。 在create文件时,文件本身是不存在xattr的,这时需要查找父目录是否具有xattr。查找父目录的xatt时,是
一直遍历找到具有xattr的那级目录
。create时,文件直接遍历获取父目录的xattr,一旦设定xattr以后,文件的xattr不允许被修改。
不支持文件级别的xattr设置
文件被创建后,原本存在的目录为
/test
,该文件所在路径为/test/mkdir/1.txt
,这样的话/test/mkdir
是一个新建的目录。如果/test
文件夹具有xattr,只需设置/test/mkdir/1.txt
的xattr。向上(朝着根目录)遍历文件夹xattr时,一旦遇到具有xattr,不管xattr的值是true还是false,停止遍历。将这个目录的xattr作用于新创建的文件。如果一直遍历到根目录都没有找到xattr,则设置文件本身的xattr为false。
一个文件被创建以后,再进行append,只需读写文件本身的xattr即可知道是否需要对文件进行压缩。
④ 最终构想
文件在create时,递归遍历父目录的xattr,直至遍历得到xattr或者遍历完整个目录。如果xattr的值为true,则设置文件压缩属性为true;xattr的值为false或者未遍历得到xattr,则设置文件压缩属性为false。
如果是对文件进行append,说明文件必须是已经存在的,直接遍历文件自身的属性。
如果是对文件进行open,同append一样,直接遍历文件自身的属性。
如果后面修改了文件夹的属性,以前已经存在的文件的xattr属性不改变。
在文件不存在时,使用
CreateFlag.OVERWRITE
和CreateFlag.CREATE
报错如下:
如果文件不存在,使用
CreateFlag.APPEND
也会报错:
综上:append方法只能接受CreateFlag.APPEND
,而且要求文件必须是已经存在的。