PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Linux » Настройки для Linux


Настройки для Linux

Сообщений 1 страница 5 из 5

1

Изначально не верно пишу для Linux и поэтому не мог разобраться как устанавливать настройки в пакете, чтобы распаковать в ~/.config.
В итоге надо создавать настройки в "/usr/share/имя_проги", а при первом запуске программы, если нет копии в ~/.config, то скопировать. Это как в Windows аналогичная система "/media/windows/Users/Default/AppData/Roaming" (или All Users), которой обычно не особо пользуются всвязи с более универсальным установщиком, который распакует настройки в любую папку.
Но  опять же для программы AutoCompletionIDE конфиг имеет 2000 файлов и делать копию в /usr/share/ не имеет особого смысла. Один файл не жалко, а вот 2000 файлов уже расточительно. А если не сделать тогда для второго пользователя невозможно создать конфиги, так как пакет уже установлен (исполняемый в папку /usr/bin). Если не использовать ~/.config, то невозможно нормально обновлять конфиги. По итогу придётся делать копии 2000 файлов.

Отредактировано AZJIO (01.06.2022 08:16:34)

0

2

AZJIO написал(а):

Один файл не жалко, а вот 2000 файлов уже расточительно.

Упаковать файлы в архив.
Приложение будет доставать из него только требуемые фалы. Если они текстовые, 7z позволит сэкономить много места.

0

3

Пётр
Попробовал сделать в архиве, получилось нормально. Обновил AutoCompletionIDE, где установочный пакет создаёт конфиги из архива, и при том так быстро, что вообще отсутствует какое либо подозрение на то что извлечено 1000 файлов, то есть окно автозавершения открывается мгновенно, несмотря на то что при при первом запуске происходит распаковка. И к тому же не хотелось увеличивать исполняемый файл и тут пакер BriefLZ выдал 2 кб прибавки к исполняемому файлу, идеально. Архив 600 кб против 180 на 7zip, но это не критично, смущало лишь число файлов и готов был даже в tar паковать (без сжатия), надеясь на маленькую прибавку модуля к исполняемому файлу, но это было не так, оп 150 кб прибавка была.

Этот код в программе:

Код:
PathConfig$ = GetHomeDirectory() + ".config/AutoCompletionIDE/"
; если нет конфига и существует архив, то распаковываем его в конфиг
If FileSize(PathConfig$) = -1 And FileSize("/usr/share/AutoCompletionIDE/config-archive-BriefLZ.blz") > 0
	#archive = 0
	If OpenPack(#archive, "/usr/share/AutoCompletionIDE/config-archive-BriefLZ.blz")
    If ExaminePack(#archive)
    	While NextPackEntry(#archive)
        If UncompressPackFile(0, PathConfig$ + PackEntryName(#archive), PackEntryName(#archive)) = -1 And ForceDirectories(GetPathPart(PathConfig$ + PackEntryName(#archive)))
        	UncompressPackFile(0, PathConfig$ + PackEntryName(#archive), PackEntryName(#archive))
        EndIf
    	Wend
    EndIf
    ClosePack(#archive)
	EndIf
EndIf

код упаковки

Код:
EnableExplicit


; wilbert
; https://www.purebasic.fr/english/viewtopic.php?p=486382#p486382
Procedure SplitL(String.s, List StringList.s(), Separator.s = " ")
	
	Protected S.String, *S.Integer = @S
	Protected.i p, slen
	slen = Len(Separator)
	ClearList(StringList())
	
	*S\i = @String
	Repeat
    AddElement(StringList())
    p = FindString(S\s, Separator)
    StringList() = PeekS(*S\i, p - 1)
    *S\i + (p + slen - 1) << #PB_Compiler_Unicode
	Until p = 0
	*S\i = 0
	
EndProcedure

Procedure FileSearch_find(List Files.s(), sPath.s, Mask$ = "*")
	Protected tmp, printf$, Len, Result.string, *Point;, shell$, comstr$, string$
	
	printf$ = "-printf '%P\n"
	tmp = RunProgram("bash", ~"-c \"find '" + sPath + "' -type f " + printf$ + ~"' 2>&1\"", "", #PB_Program_Open | #PB_Program_Read)
	If tmp
    While ProgramRunning(tmp)
    	If AvailableProgramOutput(tmp)
        If AddElement(Files())
        	Files() = ReadProgramString(tmp)
        EndIf
    	EndIf
    Wend
    CloseProgram(tmp)
    
;     Подсчитываем размер
    ForEach Files()
    	Len + Len(Files())
    Next
    Len+ListSize(Files()) ; добавляем число переносов строк #CR$ по количеству данных
    
    Result\s = Space(Len)
    *Point = @Result\s
    ForEach Files()
    	CopyMemoryString(Files()+Chr(2), @*Point)
    Next
    
    Result\s = Left(Result\s, Len(Result\s) - 1) ; заранее известен лишний символ добавляемый в перечислении CopyMemoryString()
    
;     внутри функции Files() очищается и заполняется новыми данными
    SplitL(Result\s, Files(), Chr(2))
    If ListSize(Files()) = 1 And Files() = ""
    	ClearList(Files()) 
    EndIf

	EndIf
EndProcedure

UseBriefLZPacker()
Define NewList Files.s()
FileSearch_find(Files(), "/home/user/.config/AutoCompletionIDE/")

Debug ListSize(Files())


; Создаём архивный файл
If CreatePack(0, "config-archive-BriefLZ.blz", #PB_PackerPlugin_BriefLZ)
	ForEach Files()
    	AddPackFile(0, "/home/user/.config/AutoCompletionIDE/" + Files(), Files())
	Next
     ClosePack(0)
EndIf

код для  теста распаковки

Код:
UseBriefLZPacker()

;==================================================================
;
; Author:    ts-soft
; Date:       March 5th, 2010
; Explain:
;     modified version from IBSoftware (CodeArchiv)
;     on vista and above check the Request for "User mode" or "Administrator mode" in compileroptions
;    (no virtualisation!)
;==================================================================
Procedure ForceDirectories(Dir.s)

	Static tmpDir.s, Init, delim$
	Protected result
	CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
    	delim$ = "\"
    CompilerCase #PB_OS_Linux
    	delim$ = "/"
	CompilerEndSelect
	
	If Len(Dir) = 0
    ProcedureReturn #False
	Else
    If Not Init
    	tmpDir = Dir
    	Init   = #True
    EndIf
    If (Right(Dir, 1) = delim$)
    	Dir = Left(Dir, Len(Dir) - 1)
    EndIf
    If (Len(Dir) < 3) Or FileSize(Dir) = -2 Or GetPathPart(Dir) = Dir
    	If FileSize(tmpDir) = -2
        result = #True
    	EndIf
    	tmpDir = ""
    	Init   = #False
    	ProcedureReturn result
    EndIf
    ForceDirectories(GetPathPart(Dir))
    ProcedureReturn CreateDirectory(Dir)
	EndIf
EndProcedure

Define path.s = "/media/windows/AutoCompletionIDE/тест/"

If OpenPack(0, "config-archive-BriefLZ.blz")
	If ExaminePack(0)
    While NextPackEntry(0)
    	If UncompressPackFile(0, path + PackEntryName(0), PackEntryName(0)) = -1 And ForceDirectories(GetPathPart(path + PackEntryName(0)))
        UncompressPackFile(0, path + PackEntryName(0), PackEntryName(0))
    	EndIf
    Wend
	EndIf
	ClosePack(0)
EndIf

Отредактировано AZJIO (03.06.2022 06:06:53)

0

4

Я имел в виду извлечение файлов в память. Иначе архив мало дает преимуществ. Что с ним что без него файлы будут на диске.

0

5

Пётр
Я понял, когда речь шла об одном файле, но в моём случае один файл не извлечёшь, да и в памяти держать их нет смысла. А создать конфиги из архива это удачная идея, тем более первый запуск быстрее выполняет создание конфигов, чем если бы копировал.

0


Вы здесь » PureBasic - форум » PureBasic для Linux » Настройки для Linux