网站首页 > java教程 正文
在Linux里,相当长一段时间里,用户层面并没有文件创建时间的概念,无论是用ls还是stat 指令,都无法获取到文件的创建时间,不信就试一试:
[tudou@tudou-pc statx]$ stat test-statx.c 文件:test-statx.c 大小:6656 块:16 IO 块:4096 普通文件 设备:805h/2053d Inode:6684737 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 1000/ tudou) Gid:( 1001/ tudou) 最近访问:2018-10-07 13:16:29.000000000 +0800 最近更改:2018-10-07 13:21:09.855461986 +0800 最近改动:2018-10-07 13:21:09.855461986 +0800 创建时间:-
很大几率可以看到「创建时间」一行总是「-」。
注:笔者使用的操作系统为archlinux,Kernel版本号4.10.4
如果我们使用百度的话,会看到很多文章说,最近改动时间就是创建时间。的确,我们拿很多文件试验了下,这个最近改动时间(Change Time)确实和创建时间很相近,然而Change time并不是Create time,它实际是文件属性修改时间。 试一下即知:
[tudou@tudou-pc 下载]$ stat ~/.face statx(/home/tudou/.face) = 0 results=fff Size: 7589 Blocks: 16 IO Block: 4096 regular file Device: 08:05 Inode: 5505043 Links: 1 Access: (0644/-rw-r--r--) Uid: 1000 Gid: 1001 Access: 2018-09-16 01:15:52.320014139+0800 Modify: 2018-09-16 01:15:52.320014139+0800 Change: 2018-09-16 01:15:52.320014139+0800 Attributes: 0000000000000000 (........ ........ ........ ........ ........ ........ ....-... .---.-..) [tudou@tudou-pc 下载]$ chattr +u ~/.face [tudou@tudou-pc 下载]$ stat ~/.face statx(/home/tudou/.face) = 0 results=fff Size: 7589 Blocks: 16 IO Block: 4096 regular file Device: 08:05 Inode: 5505043 Links: 1 Access: (0644/-rw-r--r--) Uid: 1000 Gid: 1001 Access: 2018-09-16 01:15:52.320014139+0800 Modify: 2018-09-16 01:15:52.320014139+0800 Change: 2018-10-07 16:17:10.929769171+0800 Attributes: 0000000000000000 (........ ........ ........ ........ ........ ........ ....-... .---.-..)
可以很清楚地看出,Change time际是文件属性修改时间,Linux还真无法获取文件创建时间。
不过,linux也不是完全不支持文件创建时间,文件系统如ext4其实是支持的,只是没有API可以获取到这个数据。比如Java提供的文件API,也就因此无法获取文件创建时间。
不过,自内核 4.11 版本引入的 statx 系统调用支持获取创建时间了,字段名里用的是 btime(Birth time)。
如果用户想要实现在代码里获取这个创建时间,那么只需要调用glibc提供的API即可。但是目前glibc还没有支持,所以只能自己用syscall函数调用。如果仅仅只是想自己实现一个小工具来获取这个时间,那么内核源码树里 samples/statx/test-statx.c 这个文件就是现成的实现。 下载源码:https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.18.12.tar.xz,选择一个和自己操作系统版本最近的源码分支 . 你要是不想下载几十M的linux源码的话,也可以从这里(https://elixir.bootlin.com/linux/v4.18.12/source/samples/statx)获取到各个linux版本的源码
我们来编译文件:
[tudou@tudou-pc statx]$ gcc -O2 -o statx test-statx.c In file included from /usr/include/sys/stat.h:446, from test-statx.c:28: /usr/include/bits/statx.h:25:8: 错误:‘struct statx_timestamp’重定义 struct statx_timestamp ^~~~~~~~~~~~~~~ In file included from test-statx.c:26: /usr/include/linux/stat.h:56:8: 附注:原先在这里定义 struct statx_timestamp { ^~~~~~~~~~~~~~~ In file included from /usr/include/sys/stat.h:446, from test-statx.c:28: /usr/include/bits/statx.h:36:8: 错误:‘struct statx’重定义
注释如下两行代码:
#define _GNU_SOURCE #define _ATFILE_SOURCE
再次编译即可。
[tudou@tudou-pc statx]$ gcc -O2 -o statx test-statx.c [tudou@tudou-pc statx]$ ./statx test-statx.c statx(test-statx.c) = 0 results=fff Size: 6656 Blocks: 16 IO Block: 4096 regular file Device: 08:05 Inode: 6684737 Links: 1 Access: (0644/-rw-r--r--) Uid: 1000 Gid: 1001 Access: 2018-10-07 13:16:29.000000000+0800 Modify: 2018-10-07 13:21:09.855461986+0800 Change: 2018-10-07 13:21:09.855461986+0800 Birth: 2018-10-07 13:16:47.771175840+0800 Attributes: 0000000000000000 (........ ........ ........ ........ ........ ........ ....-... .---.-..)
另外一个思路, 使用debugfs来搞。
注:4.19及以上内核已经支持文件创建时间了。但大部分用户的Linux服务器内核都比较老,尚不支持这个特性
猜你喜欢
- 2024-09-19 Oracle查询语句,你知道几个?(oracle查询数据有哪几种方法)
- 2024-09-19 Java.time时间处理(java处理时间格式)
- 2024-09-19 浅谈Java8日期时间处理(java日期比较)
- 2024-09-19 「案例学习」Java8 日期时间(「案例学习」Java8 日期时间段)
- 2024-09-19 Java时间类介绍:Date的使用(java中date类型的日期应该怎么写)
- 2024-09-19 Java日期时间(javadoc 日期)
- 2024-09-19 Java 8新特性探究(七)深入解析日期和时间-JSR310
- 2024-09-19 100个Java工具类之46:日期工具类之常用日期获取
- 2024-09-19 【Java】Vert.x Jackson 序列化后日期数据正常展示
- 2024-09-19 java 8 日期操作,真香(java8日期详解)
你 发表评论:
欢迎- 最近发表
-
- class版本不兼容错误原因分析(class更新)
- 甲骨文Oracle公司为Java的最新LTS版本做出改进
- 「版本发布」Minecraft Java开发版 1.19.4-pre1 发布
- java svn版本管理工具(svn软件版本管理)
- 我的世界1.8.10钻石在第几层(我的世界1.7.2钻石在哪层)
- Java开发高手必备:在电脑上轻松切换多个JDK版本
- 2022 年 Java 开发报告:Java 8 八年不到,开发者都在用什么?
- 开发java项目,选择哪个版本的JDK比较合适?
- Java版本选型终极指南:8 vs 17 vs 21特性对决!大龄程序员踩坑总结
- POI Excel导入(poi excel导入附件)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)