private static extern int RARReadHeaderEx(IntPtr hArcData, ref RARHeaderDataEx headerData);
//書庫内現在位置のファイルの情報を取得する public ReturnCode GetFileHeader(ref RARHeaderDataEx tRARHeaderDataEx) { if (shArchive.IsInvalid) return ReturnCode.Error; tRARHeaderDataEx.SetCommentBuffer(); ReturnCode retCode = ReturnCode.Error; try { retCode = (ReturnCode)RARReadHeaderEx(shArchive.DangerousGetHandle(), ref tRARHeaderDataEx); } catch { } if (retCode == ReturnCode.Success) tRARHeaderDataEx.DosDateTimeToFileTime(); return retCode; }
//------------------------------------------------------------------ // 利便性のため用意したメソッド //------------------------------------------------------------------ //書庫内のファイル一覧を取得する //戻り値: 長さ0以上の配列(エラー時もnullは返さない) public RARHeaderDataEx[] GetFileList(string arcFilePath) { //書庫ファイルを参照モードでオープンする if (!OpenArchive(arcFilePath, OpenMode.RAR_OM_LIST)) return new RARHeaderDataEx[0]; //書庫内のファイル情報を取得する List<RARHeaderDataEx> headerList = new List<RARHeaderDataEx>(); try { RARHeaderDataEx headerData = new RARHeaderDataEx(); int limitCount = 0; //無限ループ対策(保険) while (++limitCount < int.MaxValue) { ReturnCode retCode = GetFileHeader(ref headerData); if (retCode == ReturnCode.ERAR_END_ARCHIVE) break; if (retCode == ReturnCode.Success) { headerList.Add(headerData); headerData = new RARHeaderDataEx(); } FileSkip(); } } finally { CloseArchive(); } //書庫ファイルをクローズする RARHeaderDataEx[] headerDatas = new RARHeaderDataEx[headerList.Count]; if (0 < headerList.Count) headerList.CopyTo(headerDatas); headerList.Clear(); return headerDatas; }
//書庫内のファイルを取り出してフォルダに保存する public bool FileExtractToFolder(string arcFilePath, string entryPath, string folderPath) { //書庫ファイルを解凍モードでオープンする if (!OpenArchive(arcFilePath, OpenMode.RAR_OM_EXTRACT)) return false; //目的のファイルを探して解凍する RARHeaderDataEx headerData = new RARHeaderDataEx(); bool isFind = false, isOK = false; try { for (int i = 0; i < int.MaxValue && !isFind; i++) { ReturnCode retCode = GetFileHeader(ref headerData); if (retCode == ReturnCode.ERAR_END_ARCHIVE) break; if (retCode == ReturnCode.Success) { if (isFind = (headerData.FileNameW == entryPath)) //代入と判定 { isOK = FileExtract(folderPath); //ファイルを保存する break; } } FileSkip(); } } finally { CloseArchive(); } //書庫ファイルをクローズする return (isFind && isOK); }