Portál AbcLinuxu, 1. května 2025 08:53
Zrovna jsem chtěl navrhnout, že by bodlo inkrementální zálohování
\\?\D:\very long path
. Toto předáváte fcím FindFile, CreateFile, ... Taky je potřeba použít FILE_FLAG_POSIX_SEMANTIC, aby to respektovalo case-sensitive názvy a povolilo různé znaky ve výchozím stavu zakázané. Díky tomuto přístupu pak budete moci i otevřít soubory vytvořené z linuxu na NTFS systému, kde jste prdly do názvu věci jako dvojtečku. Pak je taky potřeba počítat se symlinky, hardlinky a junction, na všechno existuje API, ale runtime free pascalu s tím nepočítá (resp. nepočítalo před pár lety, jak je to teď, nevím). Pro zálohovací utilitku je potřeba tohoto použít, jinak záloha může dopadnout špatně a to jistě u zálohy nechcete.
To je AFAIK věc souborového systému, ne Windows/Exploreru.NTFS dvojtečku v názvu podporuje, stejně tak < > apod. Dokonce i Windows API se s tím vypořádá a takový soubor otevře, pokud se však to API použije správně a né mizerně, tak jak ho používá Qt či Explorer a mnoho dalších aplikací (už jenom to, že Qt interpretuje '/' jako oddělovač adresářů na Windows je stupidní). Třeba takový 7-zip je jedna z mála aplikací, která to API dokáže použít lépe, než ostatní aplikace (tj. dokáže rozbalit archiv s obrovskou hloubkou adresářů a názvy až 32k dlouhými, tak, že to pak ani nejde smazat z Exploreru, protože to neumí). Bohužel už ale nezvládá case-sensitive názvy, které jak Windows, tak NTFS podporuje.
Před časem jsem došel ke stejnému závěru: že stávající zálohovací programy mi úplně nevyhovují a že si zkusím napsat něco vlastního.
Takže jsem se do toho pustil v C++ & Qt a dotáhnul to do nějakého funkčního stavu, kde fungují alespoň základy. Pak mi ale (typicky) kvůli práci došel čas a už mi to pár měsíců leží bez toho aby na to někdo sáhl. A napsané to taky není kdovíjak skvěle.
Kdyby měl někdo zájem v tom třeba pokračovat, nebo se jen podívat, tak tady to je...
- dodělat časovátko aby to kopírovalo v nastavený časPridaj TTimer (asi zalozka System) na formular, do udalosti OnTimer pridaj
if now > datum_kedy_sa_to_ma_spustit then try timer1.Enabled := false; ...samotny kod... datum_kedy_sa_to_ma_spustit := dalsi_datum; finally timer1.Enabled := true; end;Pripadne ak chces aby sa to spustalo napr. kazdych 5 minut tak nastav Interval toho timeru na 300000 (to je 300s) a ten kod daj priamo do toho.
- mazat adresáře starší než nastavený počet dníListuj adresare cez TSearchRec (cez FindFirst, FindNext, FindClose) a starsie adresare maz cez DeleteDir. Nevie to mazat prazdne takze musis mazat rekurzivne.
- mazat adresáře od nejstaršího po dosažení nastavené velikosti adresáře zálohyHod si adresare do listu (alebo string listu, metoda CustomSort), funkcia Sort akceptuje ako parameter triediacu funkciu, vytvor si triediacu funkciu s 2 pointer parametrami ktora bude porovnavat adresare podla datumu. Alebo pouzi rovno datum yyyy-mm-dd-HH-MM-SS-zzz a bude to triedit spravne. Potom len vymazes prvy adresar z toho listu.
- možnost purgekopírování dat v adresáři – jen poslední verze ProE partů (ukládá soubory jako sestava.asm.1, při změně a uložení to vytvoří nový soubor sestava.asm.2 atd atd a purgekopírování zkopíruje jen ty poslední)To iste ako s tym sortovanim len si vytvoris inu sortovaciu funkciu.
function TriedenieAsmSuborovPodlaPripony(a,b : integer) : integer; var fa,fb : string; ca,cb : integer; begin fa := subory[a]; fb := subory[b]; if pos('.asm.', fa) then ca := StrToIntDef(ExtractFileExt(fa), -1); if pos('.asm.', fb) then cb := StrToIntDef(ExtractFileExt(fb), -1); result := ca - cb; end;
- ukládání nastavení do xml nebo cfg souboru. Nyní to používá registry (fuj?)Pouzi ini subory, pozor, cesta v atribute Create musi byt uplna!
uses IniFiles; with TIniFile.Create(GetEnvironmentVariable('HOME')+PathDelim+'.config'+PathDelim+'nieco.ini') then try Left := ReadInteger('OKNO', 'Left', 0); Top := ReadInteger('OKNO', 'Top', 0); b := ReadBool('OKNO', 'B', false); s := ReadString('OKNO', 'Meno', ''); ... zapis cez WriteInteger, WriteString, WriteBool, ... finally Free; end;
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.