Chinaunix

标题: 在C中如何获取一个文件的生成时间 [打印本页]

作者: 小雨飞    时间: 2006-08-10 18:33
标题: 在C中如何获取一个文件的生成时间
在C中如何获取一个文件的生成时间,查了半天没有查到相关函数。
作者: net_robber    时间: 2006-08-10 20:02
根据你的操作系统,查找操作系统的API,这个不属于C,应该
作者: sttty    时间: 2006-08-11 00:07
找一下关于文件系统方面的 系统调用.
作者: 新手上路2世    时间: 2006-08-11 10:04
stat 只能查到最后一次修改和最后一次进入的时间, 我也想知道create的时间是什么!!
作者: 思一克    时间: 2006-08-11 10:21
LINUX INTEL X86上好象没有.
作者: kuaizaifeng    时间: 2006-08-11 10:47
遇到过同样的问题
没有找到好的解决办法
关注………………
希望高手给个解决方法
作者: 思一克    时间: 2006-08-11 10:52
你的问题是什么

原帖由 kuaizaifeng 于 2006-8-11 10:47 发表
遇到过同样的问题
没有找到好的解决办法
关注………………
希望高手给个解决方法

作者: linuxiang    时间: 2006-08-11 11:10
原帖由 思一克 于 2006-8-11 10:52 发表
你的问题是什么


他的问题是:在C中如何获取一个文件的生成时间
作者: 思一克    时间: 2006-08-11 11:49
原帖由 linuxiang 于 2006-8-11 11:10 发表

他的问题是:在C中如何获取一个文件的生成时间


这个我知道。
我问的是他的任务是想做什么。有不少情况是,人想象出来的方法不好,而造成了对系统功能的过多要求。
比如,前天有人要对磁盘文件前删后加。而本来应该用PIPE的。

如果系统不支持CREATE TIME,也可以自己完成。
作者: mq110    时间: 2006-08-11 13:00
如果系统不支持,获得不了.
作者: kuaizaifeng    时间: 2006-08-11 13:02
原帖由 思一克 于 2006-8-11 10:52 发表
你的问题是什么




我的问题是在用户对某些文件进行查询的时候,需要知道该文件的创建的时间
作者: flw    时间: 2006-08-11 13:07
原帖由 mq110 于 2006-8-11 13:00 发表
如果系统不支持,获得不了.

我觉得,stat 系统调用返回的 st_ctime 基本上可以认为是文件的创建时间了。
作者: 思一克    时间: 2006-08-11 13:08
如果特殊的自己可以定义的文件,系统又没有CREATE TIME,自己写到文件中

原帖由 kuaizaifeng 于 2006-8-11 13:02 发表



我的问题是在用户对某些文件进行查询的时候,需要知道该文件的创建的时间

作者: mq110    时间: 2006-08-11 13:09
原帖由 flw 于 2006-8-11 13:07 发表

我觉得,stat 系统调用返回的 st_ctime 基本上可以认为是文件的创建时间了。


如果不修改可以这样认为,如果修改了呢??


time_t        st_ctime;    /* time of last status change */
作者: namtso    时间: 2006-08-11 13:35
原帖由 mq110 于 2006-8-11 13:09 发表


如果不修改可以这样认为,如果修改了呢??


time_t        st_ctime;    /* time of last status change */

不知道你的定义是在哪里看到的,我记得st_ctime就是创建时间。
另外还有一个st_atime是最后访问时间,还有一个st_mtime是最后修改时间。
作者: 思一克    时间: 2006-08-11 13:38
在LINUX上(和HP-UX同),st_ctime也不是真正的创建时间。

Q Is there any command on HP-UX which gives the file creation or modification time in seconds? 'ls -l' gives only hour and minute. I am looking for something like 'ls --full-time' on Linux.

A: There is no file creation time for HP-UX stored in the inode. The inode for a file contains last-modified time (shown by "ls -l"), a last-accessed time (shown by "ls -lu") and an inode change time (shown by "ls -lc"). The latter is often referred to as the "creation time" - even in some man pages - but that is incorrect. This time is also set by such operations as mv, ln, chmod, chown and chgrp. The man page for "stat(2)" discusses this in more detail.

The stat(2) call can be used from perl to get to the modification time seconds. For example, the following perl script will print the last modification time for "foo" in seconds since the epoch
作者: namtso    时间: 2006-08-11 13:52
那就写个程序测试一下吧,可惜我手边没有linux或者hpux.
作者: 思一克    时间: 2006-08-11 14:02
我实验过。
作者: robinliu76    时间: 2006-08-11 14:28
标题: st_ctime应该是创建时间吧
我记得这个成员是表示创建时间的,在stat的帮助里面好像就是这么说的。不过现在没有环境,不能肯定,只是凭记忆好像是这样的。
作者: kuaizaifeng    时间: 2006-08-11 14:58
原帖由 robinliu76 于 2006-8-11 14:28 发表
我记得这个成员是表示创建时间的,在stat的帮助里面好像就是这么说的。不过现在没有环境,不能肯定,只是凭记忆好像是这样的。


man 手册里不是这样说的。
我做过测试的。FC5是我的系统
作者: kuaizaifeng    时间: 2006-08-11 15:03
原帖由 flw 于 2006-8-11 13:07 发表

我觉得,stat 系统调用返回的 st_ctime 基本上可以认为是文件的创建时间了。


如果文件创建后,它的i节点的信息不做改变,该时间确实可以认作是文件的创建时间。
我的应用中,文件创建后,它的属性基本不做改变,所以我当时用的就是它
作者: isnowran    时间: 2006-08-11 15:05
st_ctime是文件i节点最后修改时间,chmod,chown,write等都会改写它;
st_ctime指的是change,不是create
作者: mq110    时间: 2006-08-11 15:10
原帖由 namtso 于 2006-8-11 13:35 发表

不知道你的定义是在哪里看到的,我记得st_ctime就是创建时间。
另外还有一个st_atime是最后访问时间,还有一个st_mtime是最后修改时间。



我说了不算, 要看man  手册.

你去看看 man 2 stat 吧.
作者: Sworder    时间: 2006-08-11 15:19
文件的时间放在文件系统里面。
拿FAT系统来说:
文件信息(文件名,文件时间,文件属性,文件长度,文件的第一个簇)保存在目录所在的簇中。
你只要能够直接读到目录的那个簇,你就可以知道文件的时间。

对直接操作硬件嵌入式系统来说,这易如反掌。

对带有OS的系统来说(带有OS的嵌入式系统也算),那么就需要OS提供相关的函数,把该目录所在的簇传递给你。或者OS帮你分析好你想要的文件的信息,通过系统调用函数传递给你。

[ 本帖最后由 Sworder 于 2006-8-11 16:21 编辑 ]
作者: kuaizaifeng    时间: 2006-08-11 15:30
原帖由 isnowran 于 2006-8-11 15:05 发表
st_ctime是文件i节点最后修改时间,chmod,chown,write等都会改写它;
st_ctime指的是change,不是create


惭愧,对自己的代码没有仔细测试,或者是测试的不够仔细。
刚才测试了一下,发现write函数会修改文件的ctime 和 mtime

man 手册
The field st_ctime is changed by writing or by setting inode  information  (i.e.,  owner,  group,  link
       count, mode, etc.)


感情里面的write 指的是文件内容阿,一直以为指的是inode
作者: kuaizaifeng    时间: 2006-08-11 15:33
原帖由 Sworder 于 2006-8-11 15:19 发表
文件的时间放在文件系统里面。
拿FAT系统来说:
文件信息(文件名,文件时间,文件属性,文件长度,文件的第一个簇)保存在目录所在的簇中。
你只要能够直接读到目录的那个簇,你就可以知道文件的时间。

对 ...



linux下有相关的函数接口吗?
现在我已经可以确定stat是不能给出文件的创建的时间的了
作者: isnowran    时间: 2006-08-11 15:48
没有
作者: kuaizaifeng    时间: 2006-08-11 15:52
原帖由 isnowran 于 2006-8-11 15:48 发表
没有


那该如何做呢?
有没有思路??
作者: isnowran    时间: 2006-08-11 16:10
文件系统根本没有保存这个时间值,你怎么获取?当然,你可以把创建时间写在文件里:)
作者: kuaizaifeng    时间: 2006-08-11 16:15
原帖由 isnowran 于 2006-8-11 16:10 发表
文件系统根本没有保存这个时间值,你怎么获取?当然,你可以把创建时间写在文件里:)


看来也只能这么作了
作者: erabbit    时间: 2006-08-11 21:24
这是一个API而非语言的问题。

DOS下(TC2.0)可以用findfirst()函数,它有参数time和date,但这是修改时间,不是创建时间。

而至于Windows环境,以下信息供参考:
1:在VC++下对文件属性的获取与更改(http://www.yesky.com/20020904/1628566.shtml
(WIN32_FIND_DATA结构,FindFirstFile()函数)
2:GetFileTime()以及FILETIME结构。

关键在于文件系统是不是提供保存文件创建时间的机制。
NTFS应该是有的,FAT16好像没有,ext分区就不知道了。
还要搞清楚这个“创建时间”究竟是如何定义的,用它编程才有意义。比如,在Windows下跨分区拷贝文件时,文件的“创建时间”属性会被改为你拷贝它的时间,这样就会造成“创建时间”比“修改时间”还往后这样看起来很奇怪的事情。
作者: fronteerman    时间: 2006-08-11 23:10
All the major file system on Linux don't support the concept of "create time"  (ext3/reiserfs/xfs). But for a specific application, you can use dnotify( before kernel 2.6.16) or inotify( kernel 2.6.16 and later) to monitor the directory for file creating and record the time in the database
作者: lovett    时间: 2006-08-12 16:51
标题: ~~~~~
FB 已经支持文件创建时间了,好象NB也是这样. OB不知道.
作者: sgiman    时间: 2006-08-15 11:51
各位老大,我不懂C,不过我觉得你们可以从系统里创建文件入手找解决办法,比如:


执行 time  mkfile   100m     filename

这个命令就能统计出产生100M文件所需的时间。
作者: sttty    时间: 2006-08-15 13:41
LZ要做什么,  也许你说明白了要creat time的目的, 大家可能会想出别的办法来扰过目前不能解决的问题.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2