[StructLayout(LayoutKind.Sequential)]
struct RAROpenArchiveDataEx
{
[MarshalAs(UnmanagedType.LPStr)]
public string ArcName;
[MarshalAs(UnmanagedType.LPWStr)]
public string ArcNameW;
public OpenMode OpenMode;
public ReturnCode OpenResult;
[MarshalAs(UnmanagedType.LPStr)]
public string CmtBuf;
private int CmtBufSize;
private int CmtSize;
public CmtState CmtState;
public ArchiveFlag Flags;
public IntPtr Callback;
public IntPtr UserData;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 28)]
private uint[] Reserved;
public void SetCommentBuffer(bool reqComment)
{
if (reqComment)
{
int bufSize = 64 * 1024;
CmtBuf = new string('\0', bufSize);
CmtBufSize = bufSize;
}
else
{
CmtBuf = null;
CmtBufSize = 0;
}
}
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct RARHeaderDataEx
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024 / 2)]
private string ArcName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
public readonly string ArcNameW;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024 / 2)]
private string FileName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 1024)]
public readonly string FileNameW;
private uint FlagBits;
private uint PackSizeLow;
private uint PackSizeHigh;
private uint UnpSizeLow;
private uint UnpSizeHigh;
public readonly HostOS HostOS;
public readonly uint FileCRC;
private uint MsDosFileTime;
public readonly uint UnpackVer;
public readonly Method Method;
public readonly FileAttributes FileAttr;
[MarshalAs(UnmanagedType.LPStr)]
private string CmtBuf;
private int CmtBufSize;
private int CmtSize;
private CmtState CmtState;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)]
private uint[] Reserved;
public FileFlag Flag { get { return (FileFlag)(FlagBits & 0x1F); } } //uint dicSizeBits = (FlagBits & 0xE0);
public long PackSize { get { return (PackSizeHigh * (uint.MaxValue + 1L) + PackSizeLow); } }
public long UnpackSize { get { return (UnpSizeHigh * (uint.MaxValue + 1L) + UnpSizeLow); } }
public DateTime FileTimeLocal { get; private set; }
public void SetCommentBuffer()
{
CmtBuf = null;
CmtBufSize = 0;
}
public void DosDateTimeToFileTime()
{
//参考 http://msdn.microsoft.com/ja-jp/library/cc429703.aspx
uint fatDate = ((MsDosFileTime >> 16) & 0xFFFF);
uint fatTime = (MsDosFileTime & 0xFFFF);
//bit15-9:year(+1980), bit8-5:month, bit4-0:day
int day = (int)(fatDate & 0x1F); fatDate >>= 5;
int month = (int)(fatDate & 0x0F); fatDate >>= 4;
int year = (int)(fatDate & 0x7F) + 1980;
//bit15-11:hour{00-23}, bit10-5:minute{00-59}, bit4-0:second{00-29}(*2)
int second = (int)(fatTime & 0x1F) * 2; fatTime >>= 5;
int minute = (int)(fatTime & 0x3F); fatTime >>= 6;
int hour = (int)(fatTime & 0x1F);
//MsDosFileTimeにはローカル時刻が格納されている
//MS-DOS形式のタイムスタンプの仕様上、2秒の誤差が出る場合がある
FileTimeLocal = new DateTime(year, month, day, hour, minute, second, DateTimeKind.Local);
}
}