我有一个从 Windows Powershell 运行的脚本,它可以更新修改的文件和上次访问的时间戳。我从 Windows 7 笔记本电脑运行该脚本,但它可以更新驻留在格式化为 ext4 的网络连接 USB 驱动器上的 ext4 文件系统上的文件时间戳。
这是脚本...
$filePath = "D:\Computing\Powershell\datetest\1TB_1.csv"
$csv = Import-Csv -Path $filePath #-Delimiter "`t"
foreach($row in $csv)
{
"Path = $($row.FullName) and Create_TS = $($row.CreatedDateUtc) and Modified_TS = $($row.ModifiedDateUtc) and Accessed_TS = $($row.AccessedDateUtc)"
$item = Get-Item $($row.FullName)
$item.CreationTimeUtc = $(Get-Date $($row.CreatedDateUtc))
$item.LastWriteTimeUtc = $(Get-Date $($row.ModifiedDateUtc))
$item.LastAccessTimeUtc = $(Get-Date $($row.AccessedDateUtc))
}
.csv 包含四列: 文件路径;创建时间戳;修改时间戳; LastAccessed_timestamp 当我运行上面的脚本时,它会使用对应时间戳单元格的行中的时间戳更新指定文件路径中的文件的时间戳。
从测试来看,它似乎有效,但我刚刚意识到,尝试更新这些文件的 Create_timestamp 不会采用 .csv 文件中的 Create_timestamp 值,而是会成为 .csv 文件中修改和访问的时间戳中较早的一个
这就是 ext4 文件系统上的文件的情况吗?还是有办法更新它们的创建时间戳?
答案1
在 Linux 中设置文件的 crtime(创建时间)是一项非常重要的任务,需要进行文件系统调试。
我之前写过一个解决方案:复制或恢复 ext4fs 文件系统上文件/目录的 crtime
我不确定你是如何设法在 Windows 下挂载读写 ext4fs 分区的,我假设你已经使用 ext2fsd 完成了它,在这种情况下,不幸的是你运气不好,因为该debugfs
应用程序仅适用于 Linux。您可能想使用例如 mingw 为 Windows 编译它,但这是一项非常重要的任务,因为 Windows 有不同的 API 来直接访问块设备。
编辑:
在格式化为 ext4 的网络连接 USB 驱动器上。
抱歉,在这种情况下无法为文件设置 crtime。
答案2
您可以使用 PowerScript 来调用SharpExt4 .Net 库修改Linux文件时间戳。
在 Powershell 中使用 .Net 代码 (C#) 和 DLL
C# 示例代码:
...
//Open a Linux ext4 disk assume your SD card/USB is physical disk 1
var disk = ExtDisk.Open(1);
//Get the file system
var fs = ExtFileSystem.Open(disk.Parititions[0]);
//Check file exists
if(fs.FileExists("/etc/hosts"))
{
fs.SetCreationTime("/etc/hosts", DateTime,Now);
}
...