Beispiel #1
0
 private static extern int RARReadHeaderEx(IntPtr hArcData, ref RARHeaderDataEx headerData);
Beispiel #2
0
        //書庫内現在位置のファイルの情報を取得する
        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;
        }
Beispiel #3
0
        //------------------------------------------------------------------
        //    利便性のため用意したメソッド
        //------------------------------------------------------------------
        //書庫内のファイル一覧を取得する
        //戻り値:	長さ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;
        }
Beispiel #4
0
        //書庫内のファイルを取り出してフォルダに保存する
        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);
        }