C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Соединение и разделение файлов
Dimon.Ru
Отправлено: 12.12.2004, 18:59


Станционный диспетчер

Группа: Участник
Сообщений: 92



Здравствуйте!

Подскажите как лучше разрешить такую проблему:
Мне нужно несколько файлов записать в один, с возможностью последующего разделения обратно.
ну типа архивирования. как бы это лучше сделать?

может быть кто-то уже делал-что-то подобное? или существуют какие-то бесплатные архиваторы или
библиотеки функций для компрессии и декомпрессии файлов, которые позволяют запаковать файлы,
а потом распаковать их обратно. (бесплатность в этом случае принципиальна!)

пытался сделать так:

CODE

   // Имена файлов
   AnsiString setupFileName=ExtractFilePath(OpenModuleDialog->FileName)+"module.mod";
   AnsiString setupFileNameDescription=ExtractFilePath(OpenModuleDialog->FileName)+"module.dsc";

   // Файлы, содержащий все для установки модуля
   // moduleSetupFile — все файлы, записанные один за другим
   // moduleSetupFileDescription — описания смещений начала записи каждого файла

   ofstream moduleSetupFile(setupFileName.c_str());
   ofstream moduleSetupFileDescription(setupFileNameDescription.c_str());

   for(int i=0; i<ModuleFilesListBox->Items->Count; i++)
   {// Перебираем по элементам ModuleFilesListBox

     // Открываем по очереди файлы, перечисленные в компоненте ModuleFilesListBox
     ifstream moduleUnitFile(ModuleFilesListBox->Items->Strings[i].c_str());

     unsigned long bytesCount=0;
     while(!moduleUnitFile.eof())
     {// Читаем файл до конца по байтам и пишем всю инфу в moduleSetupFile
      // Количество записанных байтов и имя файла пишем в moduleSetupFileDescription

      char buffer[1]; // Временная переменная
      moduleUnitFile.getline(buffer,sizeof(buffer)); //чтение
      moduleSetupFile<<buffer; //Запись
      bytesCount+=sizeof(buffer); //Подсчет прочитанных байтов
     };
     // пишем в moduleSetupFileDescription имя файла и количество байтов
     moduleSetupFileDescription<<ModuleFilesListBox->Items->Strings[i].c_str()<<"\t"<<bytesCount<<endl;
     // Закрываем файл, после того как все прочитали и записали в moduleSetupFile
     moduleUnitFile.close();
   }

   // Закрываем файлы, после того как все записали
   moduleSetupFile.close();
   moduleSetupFileDescription.close();


всё виснет и ничего не пишется sad.gif
может кто посоветует, как лучше сделать?
Георгий
Отправлено: 12.12.2004, 23:19


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



есть zip бесплатный. компонент для BCB, кажется зовётся, zipTV или TVZip.

кстати — у тебя приятный стиль программирования. где научился?

Отредактировано Георгий — 13/12/2004, 00:23
Dimon.Ru
Отправлено: 13.12.2004, 10:22


Станционный диспетчер

Группа: Участник
Сообщений: 92



QUOTE
есть zip бесплатный. компонент для BCB, кажется зовётся, zipTV или TVZip.

спасибо, ща буду искать smile.gif)

QUOTE
кстати — у тебя приятный стиль программирования. где научился?

еще раз спастбо, пока никто не хвалил smile.gif)))
а кто научил — жисть научила smile.gif))))
Dimon.Ru
Отправлено: 13.12.2004, 10:41


Станционный диспетчер

Группа: Участник
Сообщений: 92



что-то не могу найти компонениты ни TVZIP ни VCLZIP....
может они есть у кого? или ссылочку кто подскажет?
Konstantine
Отправлено: 13.12.2004, 11:18


Мастер участка

Группа: Модератор
Сообщений: 545



здесь — в закрытом форуме...
Dimon.Ru
Отправлено: 17.12.2004, 16:24


Станционный диспетчер

Группа: Участник
Сообщений: 92



С архиватором проехали.....

приведенный мной ранее код, как выяснилось, работает!!! но только для файлов с текстовым содержимым.... беда в том, что мне нужно еще и dll и exe туда же запихать.....

может кто подскажет как это сделать?
вроде бы надо как-то файлы в бинарном режиме открывать.... я пробовал, но что-то ничё не выходит.....
Slon
Отправлено: 17.12.2004, 23:01


Ученик-кочегар

Группа: Участник
Сообщений: 19



//открыть файл в бинарном режиме:
ofstream out("filename", ios::binary);
//запись символа в файл
out.put(char);

//для чтения
ifstream in("filename", ios::binary);
in.get(char&);

Также обрати внимание на функции read и write

Dimon.Ru
Отправлено: 19.12.2004, 13:26


Станционный диспетчер

Группа: Участник
Сообщений: 92



spasibo, budu probovat'!!!!!
Dimon.Ru
Отправлено: 20.12.2004, 11:07


Станционный диспетчер

Группа: Участник
Сообщений: 92



2 Slon:
Все получилось !!!!!!! спасибо ОГРОМНОЕ!!!!! smile.gif smile.gif smile.gif
Dimon.Ru
Отправлено: 23.12.2004, 15:32


Станционный диспетчер

Группа: Участник
Сообщений: 92



слушайте, совсем ничего не понимаю.......
написал так, как предложил Slon... записать файлы в один (подряд, один за другим по байтам).

надо теперь разделить их обратно.
почему-то почти все символы заменяются треугольной скобкой!!! ">"

что это может быть? или это я торможу...... ohmy.gif

Вернуться в Вопросы программирования в C++Builder