linux获取文件属性错误

banmiton 2011-09-28 10:08:05
通过lstat和fstat函数获取文件的最后访问时间和最后修改时间以及最后改变时间,获取的时间和文件通过ls -l命令查看的时间不一致,请问各位大侠,这个可能是什么原因导致?
...全文
117 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
linux_6 2011-10-02
  • 打赏
  • 举报
回复
static int listfile_long(const char *path, int flags) { struct stat s; char date[32]; char mode[16]; char user[16]; char group[16]; const char *name; /* name is anything after the final '/', or the whole path if none*/ name = strrchr(path, '/'); if(name == 0) { name = path; } else { name++; } if(lstat(path, &s) < 0) { return -1; } mode2str(s.st_mode, mode); user2str(s.st_uid, user); group2str(s.st_gid, group); // 看到这个了,如此处理的…… strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s.st_mtime)); date[31] = 0; // 12345678901234567890123456789012345678901234567890123456789012345678901234567890 // MMMMMMMM UUUUUUUU GGGGGGGGG XXXXXXXX YYYY-MM-DD HH:MM NAME (->LINK) switch(s.st_mode & S_IFMT) { case S_IFBLK: case S_IFCHR: printf("%s %-8s %-8s %3d, %3d %s %s\n", mode, user, group, (int) MAJOR(s.st_rdev), (int) MINOR(s.st_rdev), date, name); break; case S_IFREG: printf("%s %-8s %-8s %16llu %s %s\n", mode, user, group, s.st_size, date, name); break; case S_IFLNK: { char linkto[256]; int len; len = readlink(path, linkto, 256); if(len < 0) return -1; if(len > 255) { linkto[252] = '.'; linkto[253] = '.'; linkto[254] = '.'; linkto[255] = 0; } else { linkto[len] = 0; } printf("%s %-8s %-8s %s %s -> %s\n", mode, user, group, date, name, linkto); break; } default: printf("%s %-8s %-8s %s %s\n", mode, user, group, date, name); } return 0; }

Linux-Torvalds 2011-10-02
  • 打赏
  • 举报
回复
你的ls命令是如何用的?
还有你的代码是对st_atime,st_ctime,st_mtime是如何处理的?
qq120848369 2011-10-01
  • 打赏
  • 举报
回复
没观察过,atime,mtime,ctime,就这么三个东西,ls 默认是修改时间mtime吧,记不清了。ls -la ls -lc看其他两个时间,。
_了凡_ 2011-10-01
  • 打赏
  • 举报
回复
那就给你看段ls的源码中对于时间的处理部分,自己对照下:

static int listfile_long(const char *path, int flags)
{
struct stat s;
char date[32];
char mode[16];
char user[16];
char group[16];
const char *name;

/* name is anything after the final '/', or the whole path if none*/
name = strrchr(path, '/');
if(name == 0) {
name = path;
} else {
name++;
}

if(lstat(path, &s) < 0) {
return -1;
}

mode2str(s.st_mode, mode);
user2str(s.st_uid, user);
group2str(s.st_gid, group);
// 看到这个了,如此处理的……
strftime(date, 32, "%Y-%m-%d %H:%M", localtime((const time_t*)&s.st_mtime));
date[31] = 0;

// 12345678901234567890123456789012345678901234567890123456789012345678901234567890
// MMMMMMMM UUUUUUUU GGGGGGGGG XXXXXXXX YYYY-MM-DD HH:MM NAME (->LINK)

switch(s.st_mode & S_IFMT) {
case S_IFBLK:
case S_IFCHR:
printf("%s %-8s %-8s %3d, %3d %s %s\n",
mode, user, group,
(int) MAJOR(s.st_rdev), (int) MINOR(s.st_rdev),
date, name);
break;
case S_IFREG:
printf("%s %-8s %-8s %16llu %s %s\n",
mode, user, group, s.st_size, date, name);
break;
case S_IFLNK: {
char linkto[256];
int len;

len = readlink(path, linkto, 256);
if(len < 0) return -1;

if(len > 255) {
linkto[252] = '.';
linkto[253] = '.';
linkto[254] = '.';
linkto[255] = 0;
} else {
linkto[len] = 0;
}

printf("%s %-8s %-8s %s %s -> %s\n",
mode, user, group, date, name, linkto);
break;
}
default:
printf("%s %-8s %-8s %s %s\n",
mode, user, group, date, name);

}
return 0;
}

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧