我使用此程序包连接到共享目录(npm)。来自原始smb2的叉子。
我试图更改目录readdir函数(现在只返回文件名)。 所以我看了桑巴回来了我能得到的所有东西"解析"是这样的:
{ Index: 0,
CreationTime: <Buffer 05 6f bd 13 76 ba d1 01>,
LastAccessTime: <Buffer 05 6f bd 13 76 ba d1 01>,
LastWriteTime: <Buffer b8 e4 a8 09 c0 9f d1 01>,
ChangeTime: <Buffer 3e bd 43 17 c1 bc d1 01>,
EndofFile: <Buffer 57 12 00 00 00 00 00 00>,
AllocationSize: <Buffer 00 20 00 00 00 00 00 00>,
FileAttributes: 32,
FilenameLength: 16,
EASize: 0,
ShortNameLength: 0,
FileId: <Buffer 00 00 00 00 00 00 00 00>,
Filename: 'test.xxx' } ]
我可以通过FileAttributes识别文件和目录。但我需要获得CreationTime,LastAccessTime,LastWriteTime。
从缓冲区的结构我可以认识到,我需要做的只是将缓冲区转换为日期/时间。
所以我几乎尝试了一切。转换为 utf , ucs2 , readUInt32LE(0), readUInt32BE(0)。我发现this(python实现)这个时间戳是小端的,因为未加工的长long (我不经常使用python,但我认为 &lt; Q 这意味着)。但是在nodejs中没有这样的类型。
我解析了一个文件信息,如github.com/marsaud/node-smb2/blob/master/lib/messages/query_directory.js#L61
*编辑: 所以我尝试了@gnerkus解决方案,但它无法正常工作。返回此
-4.377115596215621e-89 //readDoubleBE()
Thu Jan 01 1970 01:00:00 GMT+0100 (Central Europe Standard Time) //Date()
对于某些缓冲区,它返回无效日期。
我将长度缓冲区检查为 Buffer.byteLength(obj.CreationTime),然后返回 8 。很明显,缓冲区的长度为8.所以我尝试使用函数 readUInt8()返回以下内容
6.618094934489594e-300 //readUInt8()
Thu Jan 01 1970 01:00:00 GMT+0100 (Central Europe Standard Time) //Date()
答案 0 :(得分:1)
所以,经过长期搜索微软msd和npm。我发现缓冲区长度为64位(8字节)。它由2个双字组成。无缓冲整数的含义是FILETIME时间戳。
因此,如果我想从该缓冲区解析creationTime,我需要这样做:
buffer = v.LastWriteTime;
var low = buffer.readUInt32LE(0);
var high = buffer.readUInt32LE(4);
v.LastWriteTime = FileTime.toDate({low: low, high: high}).toISOString()
我希望它会对某人有所帮助。我使用npm plugun win32filetime 将FILETIME转换为javascript 日期对象
答案 1 :(得分:0)
您可以使用buffer.readDoubleBE():
读取缓冲区// This assumes the name of the object returned by smb2 is 'obj'
var createdAt = new Date(obj.CreationTime.readDoubleBE());