Аватар для Sergey-K
238 / 229 / 58
Регистрация: 27.10.2011
Сообщений: 249

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

27.10.2011, 01:29. Показов 2328. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru