2

我正在使用 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?

4

1 回答 1

2

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

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

Unix 权限以八进制数mode的形式存储在该字段中。没有直接等效于 Windows 文件属性的属性,因此您唯一能做的就是设置只读属性(如果它们不包含“w”权限)。

于 2013-03-21T17:23:55.437 回答