Предложение Александра проще, поэтому пример по нему. Для простоты не стал делать проверок на ошибки. Вообще же, значение, возвращаемое FileOpen, надо бы проверять на 0.
files = file1.txt, file2.txt, file3.txt ; Список файлов.
archive = arch.txt ; Имя файла архива.
; Вызовы функций
pack(files, archive)
unpack(archive)
; Функции
pack(infiles, archive) ; Архивация
{
outfile := FileOpen(archive, "w") ; Открыть архив на запись.
Loop, Parse, infiles, `,, %A_Space% ; Разбор списка файлов.
{
infile := FileOpen(A_LoopField, "r") ; Открыть входной файл на чтение.
length := infile.Length() ; Измерить.
infile.RawRead(data, length) ; Считать в переменную.
infile.Close() ; Закрыть.
; Запись в архив
outfile.WriteInt(StrLen(A_LoopField)) ; Длина имени файла.
outfile.Write(A_LoopField) ; Имя файла.
outfile.WriteInt(length) ; Размер файла.
outfile.RawWrite(data, length) ; Содержимое файла.
}
outfile.WriteInt(0) ; Конец архива.
outfile.Close() ; Закрыть архив.
}
unpack(archive) ; Разархивация
{
infile := FileOpen(archive, "r") ; Открыть архив.
Loop
{
nameLength := infile.ReadInt() ; Длина имени файла.
If (nameLength = 0) ; Если 0, то конец архива.
Break
name := infile.Read(nameLength) ; Имя вложенного файла.
bytes := infile.ReadInt() ; Размер вложенного файла.
infile.RawRead(data, bytes) ; Содержимое файла.
outfile := FileOpen(name, "w") ; Создать файл.
outfile.RawWrite(data, bytes) ; Записать содержимое.
outfile.Close() ; Закрыть.
}
infile.Close() ; Закрыть архив.
}