MineOS/lib/archive.lua
Igor Timofeev 2e34bfa20c afaefaef
2015-12-20 10:39:02 +03:00

107 lines
3.8 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local fs = require("filesystem")
local unicode = require("unicode")
local package = {}
package.debugMode = false
local packageSignature = "--@luaPackageFileSignature"
local packageFileSeparator = "--@luaPackageFileSeparator"
local packageFileEnd = "--@luaPackageFileEnd"
------------------------------------------------------------------------------------------------------------------------------------
local function debug(text)
if package.debugMode then
print(text)
end
end
local function doPack(packageFileStream, path, packageFilePath, whereToSavePackedPackage)
local fileList = fs.list(path)
for file in fileList do
if fs.isDirectory(path .. file) then
doPack(packageFileStream, path .. file, packageFilePath .. file, whereToSavePackedPackage)
else
if (path .. file) ~= ("/" .. whereToSavePackedPackage) then
debug("Упаковка файла \"" .. path .. file .. "\"")
packageFileStream:write(packageFileSeparator, "\n")
packageFileStream:write("--@" .. packageFilePath .. file, "\n")
local fileFileStream = io.open(path .. file, "r")
for line in fileFileStream:lines() do
packageFileStream:write(line, "\n")
end
packageFileStream:write(packageFileEnd, "\n")
fileFileStream:close()
end
end
end
end
------------------------------------------------------------------------------------------------------------------------------------
function package.pack(whereToSavePackedPackage, pathThatContainsFilesToPack)
debug(" ")
debug("Упаковка пакета начата")
debug(" ")
local packageFileStream = io.open(whereToSavePackedPackage, "w")
packageFileStream:write(packageSignature, "\n")
doPack(packageFileStream, pathThatContainsFilesToPack .. "/", "", whereToSavePackedPackage)
packageFileStream:close()
debug(" ")
debug("Упаковка пакета завершена, файл сохранен как \"" .. whereToSavePackedPackage .. "\", его размер составил " .. math.ceil(fs.size(whereToSavePackedPackage) / 1024) .. "КБ")
debug(" ")
end
function package.unpack(pathToPackedPackage, whereToSaveUnpackedFiles)
debug(" ")
debug("Распаковка пакета начата")
debug(" ")
fs.makeDirectory(whereToSaveUnpackedFiles)
local packageFileStream = io.open(pathToPackedPackage, "r")
--Проверка сигнатуры файла пакета
local readedSignature = packageFileStream:read("*l")
if readedSignature ~= packageSignature then error("Ошибка чтения файла пакета: неверная сигнатура. Возможно, вы пытаетесь наебать эту программу и подсовываете ей левый файл?\n") end
--Распаковка файла пакета на основе записей из него
local line = ""
local fileFileStream
while line do
line = packageFileStream:read("*l")
if line == packageFileSeparator then
local path = unicode.sub(packageFileStream:read("*l"), 4, -1)
fs.makeDirectory(whereToSaveUnpackedFiles .. "/" .. (fs.path(path) or ""))
debug("Распаковка файла \"" .. whereToSaveUnpackedFiles .. "/" .. path .. "\"")
fileFileStream = io.open(whereToSaveUnpackedFiles .. "/" .. path, "w")
elseif line == packageFileEnd then
fileFileStream:close()
else
fileFileStream:write(line, "\n")
end
end
packageFileStream:close()
debug(" ")
debug("Распаковка пакета \"" .. pathToPackedPackage .. "\" завершена")
debug(" ")
end
------------------------------------------------------------------------------------------------------------------------------------
--package.pack("1.pkg", "MineOS")
--package.unpack("1.pkg", "unpackedFiles")
------------------------------------------------------------------------------------------------------------------------------------
return package