Javascript 获取节点中的文件创建日期

Javascript 获取节点中的文件创建日期,javascript,node.js,date,filesystems,Javascript,Node.js,Date,Filesystems,在node中,我可以使用标准的file stat对象获取文件的修改日期。有没有办法找到它的创建日期?我在文档中根本找不到任何内容。如果您使用的是Linux,则无法访问此信息(尽管它存储在Ext4文件系统中)。因此,fs.stat只返回atime,ctime,mtime值。能否获得文件创建时间取决于操作系统和文件系统。传统的POSIX只定义ctime,也就是(相当令人困惑的)inode修改日期,而不是其他人提到的创建日期。但是,在某些操作系统上,您可以获得st_birthtimespec或st_b

在node中,我可以使用标准的file stat对象获取文件的修改日期。有没有办法找到它的创建日期?我在文档中根本找不到任何内容。

如果您使用的是Linux,则无法访问此信息(尽管它存储在Ext4文件系统中)。因此,
fs.stat
只返回
atime
ctime
mtime
值。

能否获得文件创建时间取决于操作系统和文件系统。传统的POSIX只定义ctime,也就是(相当令人困惑的)inode修改日期,而不是其他人提到的创建日期。但是,在某些操作系统上,您可以获得st_birthtimespec或st_birthtime,这是一个真正的“创建”时间。您需要检查主机操作系统上的sys/stat.h,看看有什么可用的

不幸的是,能否从node.js访问整个stat结构是另一回事。但至少你可以弄清楚你的操作系统是否支持它,并从那里开始

2019年更新:

您始终可以访问此属性,但在许多文件系统上,它将是错误的。根据Node.js文档:

在出生时间不可用的文件系统上,此字段可以保留ctime或1970-01-01T00:00Z(即Unix历元时间戳0)。在这种情况下,此值可能大于atime或mtime。在Darwin和其他FreeBSD变体上,如果使用utimes(2)系统调用将atime显式设置为早于当前出生时间的值,则也会设置。


如果有人在这段时间后绊倒了,从节点v0.12.0开始,请使用以下命令:

fs.stat(path, callback)
其中回调有两个参数err&stats。Stats对象具有属性

birthtime
这是创建日期


链接到节点api文档

我正在使用Fedora,fs.stat结果中没有“生日”字段。但也许您可以尝试使用节点的child_进程来调用ls——全职。至少在我的机器上,它给了我正确的结果

fs.stat结果:

{ dev: 64771,
  mode: 33279,
  nlink: 1,
  uid: 1000,
  gid: 1000,
  rdev: 0,
  blksize: 4096,
  ino: 2098445,
  size: 48523700,
  blocks: 94776,
  atime: Sat Jul 04 2015 19:01:29 GMT+1000 (AEST),
  mtime: Thu Aug 22 2013 16:45:10 GMT+1000 (AEST),
  ctime: Sat Jul 04 2015 19:01:29 GMT+1000 (AEST) }
ls——全职

  -rwxrwxrwx. 1 pahuang pahuang 22M 2013-06-23 17:51:08.000000000 +1000 test_media/processed/20130621.mkv

这里有一个在Linux和macOS(对不起,Windows用户)上都很好用的解决方案

这是一个可以导入到其他代码中的模块,它使用节点的
util.exec()
方法作为子进程传递UNIX命令,并返回转换为整数的UNIX时间戳字符串

如果子进程失败,它将返回
null

const util=require(“util”);
const exec=util.promisify(require(“子进程”).exec);
const executeCommand=async(cmd)=>{
试一试{
返回wait exec(cmd,{timeout:2000})。然后(async({stdout,stderr})=>{
如果(标准){
返回null;
}
如果(标准输出){
返回标准输出;
}
});
}catch(cmdErr){
返回null;
}
};
exports.getFileDate=异步(文件路径)=>{
试一试{
设cmd=``;
if(process.platform==“linux”){
cmd=`stat-c%Y“${filePath}`;
}else if(process.platform==“darwin”){
cmd=`stat-s“${filePath}”`;
}否则{
错误(`getFileDate()=>错误:仅支持'linux'和'darwin'平台');
返回null;
}
让getDateResult=等待executeCommand(cmd);
如果(getDateResult==null){
返回null;
}
//Linux
if(process.platform==“linux”){
getDateResult=parseInt(getDateResult);
返回getDateResult;
}
//马科斯
else if(process.platform==“darwin”){
//获取创建时间开始的索引
让start=getDateResult.indexOf(“st_ctime”);
//不同的时间戳由空格分隔
让creationDate=getDateResult.substring(开始,getDateResult.length);
//解析完整字符串以获取“st_ctime”值
设splitResult=creationDate.split(“”);
让timestamp=splitResult[0]。替换(“st_ctime=”,“”);
//如果不是数字,则返回“null”
if(isNaN(时间戳)){
返回null;
}否则{
timestamp=parseInt(时间戳);
返回时间戳;
}
}
//捕捉错误
}捕捉(错误){
错误(`getFileDate()=>${err}`);
返回null;
}
};
只需将此新模块导入另一个脚本(假设它位于同一目录中):

const{getFileDate}=require(“./getFileDate”);
..然后可以将文件路径传递给函数调用,并将UNIX时间戳转换为可读的日期字符串,如下所示:

让unixTimestamp=wait getFileDate(“path/to/some/file.txt”);
let dateStr=新日期(unixTimestamp*1000);
console.log(dateStr);

util.inspect(stats)
应该为您提供以下信息。。。你从中得到了什么?3个日期值——atime、ctime和mtime,它们都不是创建的时间(ctime是更改的时间)。根据我读到的所有其他内容,ctime是更改的时间,这与修改的时间相似,但不完全相同。不幸的是,你是对的(我以为
ctime
是为
创建时间
).我会尝试一些东西,但是,如果找不到答案,我会删除这个。看看这个:2019年还是这样吗?我想是的。这取决于操作系统/文件系统,它可能仍然以同样的方式工作。@fraber显然OP认为我解决了他的问题,所以我不确定你的投诉理由是什么。他不需要帮助了解nding JS,他需要了解文件系统的基础。如果问题是“JS调用什么是访问文件系统统计结构所必需的”,我同意你的看法,但他不是这么问的。我感谢你的详细技术知识,但我相信这个家伙(和我一样)只是需要一个简单的解决方案来获取创建日期。Flaky的下面的答案提供了它…@fraber下面的答案是不完整的。它只适用于某些用户。许多Unix用户使用的文件系统上没有此值