.copy – nový dot command pro ZX Spectrum Next
Jak jsem psal včera - vydal jsem Calm Commander 1.0 a jedna z jeho novinek byla i kopírování adresářů a podadresářů a to do hloubky 11 podaddresářů. Uveřejnil jsem tuto novinku na FB stránce ZX Spectrum Next s tím, že si chvilku odpočinu, ale rozhořela se tam diskuze o tom, proč není Calm Commander dot command. Je to jednoduché - protože já ho jako dot command nikdy nechtěl - popravdě si myslím, že by to bylo kontraproduktivní. Calm Commander zabírá spousttu místa - LFN i 8.3 jména souborů/adresářůnačteného adresáře si drží v paměti, při kopírování si ukládá data do co největší části paměti, pluginy sami o sobě také něco sežraly (myslím tím paměť). Ale nějak se tam ve mne zrodila myšlinka udělat několik dot příkazů - kopírování, delete a dirinfo. A dnes bych Vám rád představil příkaz copy.
Syntaxe
.copy zdroj cil .copy -s zdroj -d cil
Oba formáty jsou rovnocenné. Cesty s mezerami v názvu uzavřete do uvozovek.
Přepínače
-m— move (přesun): po úspěšném zkopírování smaže zdrojový soubor nebo adresář-y— yes (přepis): přepisuje existující cílové soubory; bez tohoto přepínače se existující soubory přeskočí-h— zobrazí nápovědu
Kopírování jednoho souboru:
Soubor se čte do 8 kB pracovního bufferu na adrese $DC00 a zapisuje se na cíl po blocích.
Pokud cíl končí lomítkem nebo jde o existující adresář, jméno zdrojového souboru se přidá automaticky.
Jinak se cílová cesta použije jako výsledné jméno souboru.
Kopírování adresáře (rekurzivní):
- Příkaz prochází adresářový strom do hloubky 11 úrovní (MAX_DEPTH = 11).
- Každý podadresář vytvoří v cíli (F_MKDIR – chyba „již existuje" se ignoruje).
- Soubory v každém podadresáři zkopíruje se zachováním dlouhých jmen (LFN).
- Před vlastní kopií projde strom naprázdno a spočítá položky – kvůli zobrazení průběhu.
- Průběh se zobrazuje jako
Copying: nazev_adresare (X/celkem)a pro každý souborsoubor [XkB/CelkemkB]. - Adresářové handles se před rekurzí uzavírají a po ní znovu otevírají – tím se obchází omezení NextZXOS na počet současně otevřených handles.
Přesun adresáře (-m):
Nejprve proběhne kompletní rekurzivní kopie, pak se celý zdrojový strom smaže (soubory přes F_UNLINK, adresáře přes F_RMDIR zdola nahoru).
Pro přesun jednoho souboru se nejdříve zkusí F_RENAME (rychlé přejmenování na stejném disku); teprve pokud selže, provede se kopie + smazání.
Chování při přepisu
- Bez
-y: existující cílový soubor se přeskočí a zobrazí seSkipping existing: jmeno. - S
-y: cílový soubor se přepíše.
Pravidla pro cílovou cestu
- Cíl končí
/nebo\→ zdrojové jméno se přidá za lomítko. - Cíl je existující adresář → zdrojové jméno se zkopíruje do tohoto adresáře.
- Jinak → cíl je výsledné jméno souboru nebo adresáře.
- Zdrojová cesta s koncovým lomítkem (
adresar/) se normalizuje naadresar.
Bezpečnostní pojistky
- Ochrana před kopírováním adresáře do sebe: příkaz zjistí, zda cílová cesta není podadresářem zdrojové, a kopii odmítne.
- Ověření cílového rodiče: před zahájením kopie zkontroluje, že nadřazený adresář cíle existuje. Pokud ne, skončí s hláškou
copy: destiny path not found. - Přerušení stiskem BREAK (CAPS SHIFT + SPACE): zastaví operaci kdykoli, smaže rozepsaný cílový soubor a vypíše
Cancelled. - Příkaz instaluje ROM error handler, aby chyby (typicky chybějící jednotka na emulátorech) nespadly do BASICu.
Výkon
Během kopírování a mazání se CPU dočasně přepne na 28 MHz (NextReg $07 = 3). Po skončení – ať úspěšném, chybném, nebo zrušeném – se turbo vrátí na původní hodnotu.
Pár technických věcí
- Pracovní buffer: 8192 bajtů na adrese
$DC00–$FBFF - Zásobník zdrojových cest:
$C000(12 × 256 bajtů) - Zásobník cílových cest:
$CC00(12 × 256 bajtů) - Maximální délka cesty: 255 znaků
- Maximální hloubka podadresářů: 11 úrovní
- Adresáře se čtou v LFN režimu → dlouhá jména jsou zachována
- Spouští se na adrese
$2000(standardní dot command)
Příklady
.copy zaloha zaloha2
Zkopíruje soubor nebo adresář zaloha do zaloha2.
.copy -y "Calm Commander" "backup/"
Zkopíruje adresář Calm Commander (s mezerou v názvu) do backup/Calm Commander. Existující soubory přepíše.
.copy -s "muj adresar" -d "d:/moje zaloha"
Kopírování s cestami v uvozovkách je vhodné, když cesta obsahuje mezery.
.copy -m stary novy
Přesune adresář stary na novy (kopie + smazání zdroje).
Chybové hlášky a výstup z .copy
copy: missing or bad arguments— chybí zdroj nebo cíl, nebo neznámý přepínačcopy: destiny path not found— nadřazený adresář cíle neexistujecopy: esxDOS error $XX stg $YY— interní chyba; XX je esxDOS chybový kód, YY je fáze (pro ladění)Skipping existing: jmeno— soubor na cíli existuje a nebyl zadán-yCancelled.— uživatel stiskl BREAKDone.— kopírování nebo přesun úspěšně dokončen
Ke stažení: shrek128.itch.io



Zajímavé řešení pro kopírování adresářů a podadresářů — limit 11 úrovní je pozoruhodný. Líbí se mi, že se příkaz .copy snaží zachovat jednoduché ovládání i při práci s hlubší strukturou souborů.
Díky za komentář... a popravdě milá slova... ;)
Já jsem rád, že děláš ty samostatné dot příkazy místo úprav Calm Commanderu – zajímá mě, jak zvládnou kopírování adresářů do hloubky.
learn more here
Tak vyzkoušej, není nic jednodušího.
Jinak nedělám tyto příkazy místo Calm Commanderu. Dělám tyto příkazy souběžně s Calm Commanderem ;)