如何获取归档在 tar 中的文件(和其他属性)的创建时间?

Posted

技术标签:

【中文标题】如何获取归档在 tar 中的文件(和其他属性)的创建时间?【英文标题】:How to get creation time of file (& other properties) that is archived inside tar? 【发布时间】:2013-03-21 15:17:58 【问题描述】:

我正在使用 VS 2010 和 Win32 用 C++ 编写代码来简单地提取 TAR 文件。

我已经完全从头实现了算法来进行提取。

我有一个像这样的 TAR 标头结构:

/* tar Header Block, from POSIX 1003.1-1990.  */

/* POSIX header.  */

struct posix_header
                              /* byte offset */
  char name[100];               /*   0 */
  char mode[8];                 /* 100 */
  char uid[8];                  /* 108 */
  char gid[8];                  /* 116 */
  char size[12];                /* 124 */
  char mtime[12];               /* 136 */
  char chksum[8];               /* 148 */
  char typeflag;                /* 156 */
  char linkname[100];           /* 157 */
  char magic[6];                /* 257 */
  char version[2];              /* 263 */
  char uname[32];               /* 265 */
  char gname[32];               /* 297 */
  char devmajor[8];             /* 329 */
  char devminor[8];             /* 337 */
  char prefix[155];             /* 345 */
                                /* 500 */
;

从结构中,我可以使用 mtime[12] 保留修改后的文件时间戳。 然后我使用 Win32 ::SetFileTime() 函数来更新提取文件的时间戳属性。

但问题在于访问创建文件时间和最后访问时间。

谁能帮我找出这些信息在 TAR 标头中的存储位置???

还有我将如何解码文件权限,如只读、隐藏、系统.. for Windows???

【问题讨论】:

【参考方案1】:

TAR 文件格式是 Unix 发明的,因此它存储的文件信息并不总是能很好地映射到 Windows 约定。

创建和访问时间不是以标准 TAR 格式存储的,因此您需要将它们保留为默认值,或者设置为与修改时间相同的值。但是,您实际上可能有一个ustar format 文件,这确实增加了将此类信息存储在扩展文件条目中的可能性。详情请见here。

Unix 权限以an octal number 的形式存储在mode 字段中。没有与 Windows 文件属性直接等效的属性,因此您唯一能做的就是在它们不包含“w”权限的情况下设置只读属性。

【讨论】:

你分享的链接我之前访问过但没有引用它,因为 /* Jörg Schilling 星标 */ 前缀字段再次拆分为前缀、atime 和 ctime,我认为这没有意义. 这个实用程序www.gnu.org/software/tar 在我尝试时显示不同的创建时间和提取后的修改时间。不知道他们用了什么...

以上是关于如何获取归档在 tar 中的文件(和其他属性)的创建时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用tar 进行文件归档,看完你就懂了

在Linux 中如何归档文件和目录

如何创建Tar Gz文件

文件传输和为今年归档

linux 下 压缩命令都有哪些?那个压缩比最高?

tar命令是怎么使用?