Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Sergey-K
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249

UnRar.dll - номер тома

27.10.2011, 01:29. Показов 2306. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем Привет!
Подскажите пожалуйста как можно получить информацию о номере тома многотомного архива.
Нужно: Edit1->Text =
Список файлов получаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <vcl.h>
#pragma hdrstop
#include <unrar.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
void ListArchive(AnsiString ArcName)
{
  HANDLE hArcData;
  int RHCode,PFCode;
  RARHeaderData HeaderData;
  RAROpenArchiveData OpenArchiveData;
  OpenArchiveData.ArcName = ArcName.c_str();
  OpenArchiveData.OpenMode = RAR_OM_LIST;
  hArcData = RAROpenArchive(&OpenArchiveData);
  if(hArcData != 0)
    {
      for(;;)
        {
          PFCode = RARProcessFile(hArcData, RAR_SKIP, NULL, NULL);
          RHCode = RARReadHeader(hArcData, &HeaderData);
          if((PFCode == 0) && (RHCode == 0))
            {
              if(AnsiString(HeaderData.FileName).AnsiPos("\\") != 0)
                {
                  Form1->ListBox1->Items->Add(AnsiString(HeaderData.FileName));
                }
            }
          else
            {
              break;
            }
        }
    }
  RARCloseArchive(hArcData);
}
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ListBox1->Items->Clear();
  ListArchive("C:\\Archive.rar");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2011, 01:29
Ответы с готовыми решениями:

Как работать с файлами архива .rar (unrar.dll)
Ребята подскажите как работать с файлами архива .rar? На Дельфи я спрашивал, думал, что смогу переделать на С++ но я в тупике ни чего не...

Порядковый номер 354 не найден в библиотеке DLL LIBEAY32.DLL
Всем привет, вылезает ошибка при компиляции приложения &quot;Порядковый номер 354 не найден в библиотеке DLL LIBEAY32.DLL&quot;. Работаю со...

Использование unrar.dll
Ребята подскажите компонент для работы с архивом *.rar Как я замечал, используют dll-ку (unrar.dll). Вы не могли бы дать описание, если...

5
 Аватар для Sergey-K
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249
06.11.2011, 14:19  [ТС]
Изучал документацию, смотрел пример. В структуре RAROpenArchiveDataEx есть переменная Flags
Possible values:

0x0001 Volume attribute (archive volume)
Смог получить только булево значение - многотомник это или нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
TStringList* FileList = new TStringList();
bool MultiPart;
//---------------------------------------------------------------------------
void ListArchive(AnsiString ArcName)
{
  MultiPart = false;
  HANDLE hArcData;
  RARHeaderDataEx HeaderData;
  RAROpenArchiveDataEx OpenArchiveData;
  memset(&OpenArchiveData, 0, sizeof(OpenArchiveData));
  OpenArchiveData.ArcName = ArcName.c_str();
  OpenArchiveData.OpenMode = RAR_OM_LIST_INCSPLIT;
  hArcData = RAROpenArchiveEx(&OpenArchiveData);
  if(hArcData != 0)
    {
      if((OpenArchiveData.Flags & 1) != 0)
        {
          MultiPart = true;
        }
      while(RARReadHeaderEx(hArcData, &HeaderData) == 0)
        {
          FileList->Add(AnsiString(HeaderData.FileNameW));
          if(RARProcessFile(hArcData, RAR_SKIP, NULL, NULL) != 0)
            {
              break;
            }
        }
    }
  RARCloseArchive(hArcData);
}
Как получить номер тома пока загадка
0
 Аватар для Sergey-K
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249
20.02.2012, 21:29  [ТС]
Выкрутился таким способом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//---------------------------------------------------------------------------
HANDLE SpawnAndRedirect(LPCTSTR commandLine, HANDLE *hStdOutputReadPipe, LPCTSTR lpCurrentDirectory)
{
  HANDLE hStdOutputWritePipe, hStdOutput, hStdError;
  CreatePipe(hStdOutputReadPipe, &hStdOutputWritePipe, NULL, 0);
  DuplicateHandle(GetCurrentProcess(), hStdOutputWritePipe,GetCurrentProcess(), &hStdOutput,0, TRUE, DUPLICATE_SAME_ACCESS);
  DuplicateHandle(GetCurrentProcess(), hStdOutput, GetCurrentProcess(), &hStdError, 0, TRUE, DUPLICATE_SAME_ACCESS);
  CloseHandle(hStdOutputWritePipe);
  PROCESS_INFORMATION pi;
  STARTUPINFO si;
  ZeroMemory(&si, sizeof(STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
  si.hStdInput  = GetStdHandle(STD_INPUT_HANDLE);
  si.hStdOutput = hStdOutput;
  si.hStdError  = hStdError;
  si.wShowWindow = SW_HIDE;
  TCHAR commandLineCopy[1024];
  strcpy(commandLineCopy, commandLine);
  if(!CreateProcess(NULL, commandLineCopy, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, lpCurrentDirectory, &si, &pi))
    {
      CloseHandle(hStdOutput);
      CloseHandle(hStdError);
      CloseHandle(*hStdOutputReadPipe);
      *hStdOutputReadPipe = INVALID_HANDLE_VALUE;
      return NULL;
    }
  CloseHandle(pi.hThread);
  CloseHandle(hStdOutput);
  CloseHandle(hStdError);
  return pi.hProcess;
}
//---------------------------------------------------------------------------
AnsiString GetInfo(LPCTSTR commandLine)
{
  HANDLE hOutput, hProcess;
  hProcess = SpawnAndRedirect(commandLine, &hOutput, NULL);
  if(!hProcess)
    {
      return "";
    }
  CHAR buffer[128];
  CHAR out[131072] = "";
  DWORD read;
  while(ReadFile(hOutput, buffer, 128, &read, NULL))
    {
      buffer[read] = '\0';
      lstrcatA(out, buffer);
    }
  CHAR msg[131072] = "";
  OemToCharA(out, msg);
  AnsiString str = AnsiString(msg);
  CloseHandle(hOutput);
  CloseHandle(hProcess);
  return str;
}
//---------------------------------------------------------------------------
AnsiString GetVolNum(AnsiString FilePath)
{
  AnsiString Command = "\"" + Patch + "UnRar.exe" + "\"" + " v[t,b] " + "\"" + FilePath + "\"";
  AnsiString Result = GetInfo(Command.c_str());
  int tmp;
  bool bl = false;
  AnsiString Vol = "";
  for(int i = 0; i < Result.Length(); i++)
    {
      if(TryStrToInt(AnsiString(Result[Result.Length() - i]), tmp))
        {
          Vol = IntToStr(tmp) + Vol;
          bl = true;
        }
      else
        {
          if(bl)
            {
              break;
            }
        }
    }
  if(Vol.Length() == 1)
    {
      Vol = "00" + Vol;
    }
  else if(Vol.Length() == 2)
    {
      Vol = "0" + Vol;
    }
  return Vol;
}
//---------------------------------------------------------------------------
Использовал консольную UnRar.exe.
0
 Аватар для Sergey-K
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249
26.02.2012, 16:42  [ТС]
Придумал еще один способ:
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TFileStream *stream = new TFileStream("C:\\Archive.rar", fmOpenRead);
  if(stream != NULL)
    {
      stream->Position = stream->Size - 9;
      int vol;
      stream->Read(&vol, sizeof(vol));
      Edit1->Text = IntToStr(vol + 1);
    }
  delete stream;
0
 Аватар для __bool
288 / 229 / 27
Регистрация: 13.06.2010
Сообщений: 744
26.02.2012, 16:59
Цитата Сообщение от Sergey-K Посмотреть сообщение
C++
1
stream->Position = stream->Size - 9;
Почему -9?
0
 Аватар для Sergey-K
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249
26.02.2012, 17:28  [ТС]
Там хранится информация о номере тома. WinHex-ом нашел
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.02.2012, 17:28
Помогаю со студенческими работами здесь

Пытаюсь работать с UNRAR.dll
Люди подскажите,пытаюсь работать с UNRAR.dll , но чёто задуманное не выходит совсем. есть программа которая рабочая, но я пишу свою,...

Как подключить unrar.dll к проекту на C#?
Есть задача - распаковать, программно, rar-архив. После недолгих поисков узнал что существует библиотека unrar.dll, которая позволяет...

Интеграция Unrar.dll для распаковки RAR архивов
Здравствуйте. Не являюсь программистом, а тем более 1С, но пробую решить задачу распаковки архивов средствами 1С. Использую библиотеку...

Где находится серийный номер тома?
В BIOS или на где-то на харде) если на харде то можно указать путь) заранее благодарю)

Ассемблем(Серийный номер тома) для MS-DOS
Люди помогите надо на ассемблере написать резидентную прогу для MS-DOS которая считывала бы серийный номер тома, Для примера лучше Флоп...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru