# Práce se soubory a složkami (adresáři) - Se soubory se dá pracovat jako s nedělitelnými jednotkami, kdy je lze přesouvat, kopírovat, mazat atd. - Obsah souboru se rovněž dá číst a zapisovat ### Základní pojmy - Některé základní pojmy již byly zmíněny, zde budou uvedeny systematicky #### Soubor a složka (adresář) - Soubor (file) - Základní jednotka uspořádání dat na disku (z pohledu uživatele i z pohledu programátora) - Obsahuje data v závislosti na typu souboru - Název souboru - Např. ```data.txt, TBBT.s10.e13.avi``` - Jednoznačná identifikace souboru v rámci jedné složky - V jedné složce nemůžou být dva soubory se stejným jménem - POZOR! - Linux je „case-sensitive“ (citlivý na velikost písmen), jména ```soubor.txt``` a ```Soubor.txt``` jsou tedy různá a mohou být v jedné složce (ale není to rozumné) - Windows není „case-sensittive“, jména ```soubor.txt``` a ```Soubor.txt``` jsou tedy stejná a nemohou být v jedné složce - Délka názvu je omezena (např. ve Windows na 255 znaků), ale je dostačující - Název může obsahovat většinu běžných znaků s několika výjimkami (např. lomítko „/“ a zpětné lomítko „\“) - Přípona souboru - Vše od poslední tečky do konce názvu souboru (tj. je součástí názvu) - Typicky udává typ souboru - Většina souborů příponu má, ale mít ji nemusí - Složka/adresář (folder/directory) - Složky mají hierarchickou strukturu - Název složky (adresáře) - Platí stejná pravidla a omezení jako pro soubory - Přípona složky - Složky příponu většinou nemají - Ale mohou ji mít - Každá složka (adresář) může obsahovat další soubory a složky (adresáře) - Ve skutečnosti se jedná o speciální soubor, který má v sobě (v nějaké formě) uložený seznam souborů a složek, které obsahuje - Podrobněji viz předmět KIV/ZOS #### Cesta a související pojmy - Cesta (ke složce či k souboru) - Posloupnost názvů složek, které jsou oddělené lomítkem „/“ (Linux i Windows) nebo zpětným lomítkem „\“ (Windows) - Důležité složky (adresáře) se speciálním označením - Kořenová složka (adresář) – root folder (directory) - Složka, která je v hierarchii nejvýše (sama v žádné složce neleží) - Označuje se lomítkem „/“ (v Linuxu i ve Windows) nebo zpětným lomítkem „\“ (ve Windows) - Ve Windows je kořenová složka na každém logickém disku (označeném písmenem) - V Linuxu je jen jedna kořenová složka a další disky se připojují do hierarchické struktury složek - Lze i ve Windows, ale příliš často se to nepoužívá - Aktuální složka (adresář) – current folder (directory) - Složka, ve které se právě nacházíme (typicky složka, ze které je spuštěn náš program) - Označuje se jednou tečkou „.“ - Tato speciální složka ukazuje sama na sebe a nachází se v každé složce - Nadřazená složka (adresář) – parent folder (directory) - Složka, která je v hierarchii bezprostředně nad aktuální složkou - Označuje se dvěma tečkami „..“ - Tato speciální složka odkazující na nadřazenou složku aktuální složky (tj. ve které se aktuální složka nachází) se nachází v každé složce - V kořenové složce ukazuje stejně jako „.“ sama na sebe - Absolutní cesta - Začíná v kořenové složce, začíná lomítkem - Např. /home/skola/ppa1 - Např. D:\Users\tpotuzak\Skola\PPA1 - Ve Windows má každý logický disk (označený písmenem) svou kořenovou složku, proto je písmeno (D:) součástí absolutní cesty – v rámci jednoho disku začíná absolutní cesta „\“ - Při použití absolutní cesty je jedno, jaká je aktuální složka - Z každé aktuální složky ukazuje na stejný objekt (složku nebo soubor) - Relativní cesta - Je relativní k aktuální složce – k jednomu objektu jsou relativní cesty z různých aktuálních složek různé - Může začínat - Aktuální složkou „.“ (v Linuxu často nutné, ve Windows není nutné) nebo názvem podřazené složky (ve Windows) - Nadřazenou složkou „..“ - Např. ```./skola/ppa1``` - Úplné jméno souboru (či složky) - Jednoznačná identifikace souboru (či složky) v rámci celého souborového systému - Absolutní cesta včetně názvu souboru (či složky) - Např. ```D:\Users\tpotuzak\Skola\PPA1\data.txt``` ### Rozhraní Path a třídy Paths a Files - Pro práci se soubory jako s celky se dají využít třídy ```Paths, Files``` a rozhraní ```Path``` z balíku ```java.nio.file``` - Rozhraní ```Path``` reprezentuje cestu, tj. soubor nebo adresář (složku) - Podrobně o rozhraní viz předmět KIV/OOP - V dalším textu se budeme k rozhraní ```Path``` chovat, jako by to byla třída - Třída ```Files``` obsahuje mnoho statických metod pro práci se soubory - Kromě práce se souborem jako celkem umožňuje i práci s obsahem souboru - Lze pracovat se soubory i složkami - V názvech metod se používá se výhradně název „adresář“ („directory“), název „složka“ („folder“) se nepoužívá - S adresáři lze provádět téměř stejné operace jako se soubory (mazání, přesun, kopírování, atd.), proto existuje jedna třída pro práci jak se soubory tak s adresáři #### Zajištění nezávislosti na operačním systému - Protože různé operační systémy používají různé oddělovače složek v cestě, je ve třídě ```File``` definována proměnná (řetězec) s oddělovačem, která je nastavená podle operačního systému, na kterém je program spuštěn - ```File.separator``` - Tato proměnná by se měla používat, pokud vytváříme cestu z jednotlivých jmen adresářů - V Linuxu je její hodnota "/", ve Windows je její hodnota "\\" - Např. ```String jmeno = File.separator + "ppa1" + File.separator + " data.txt";``` - Třída File je z balíku java.io a původně se používala pro práci se soubory jako s celky (místo ```Path```, ```Paths```, a ```Files```) - Pokud místo této proměnné použijeme přímo jedno z lomítek, pak je lepší použít obyčejné lomítko „/“, protože funguje na Linuxu i na Windows - Zpětné lomítko se navíc v Javě používá pro zápis speciálních znaků (např. „\\n“ pro konec řádky) a je tedy nutné ho zdvojovat „\\\\“ #### Základní operace s cestou - Rozhraní ```Path``` - Používá se jako parametr v mnoha metodách třídy ```Files``` (jako parametr určující soubor či složku, se kterou bude metoda pracovat) - Soubor či adresář (složka) reprezentovaný instancí ```Path``` může, ale nemusí existovat - Obsahuje pouze operace pro práce s cestou samotnou - Vytvoření nové instance - Nová instance se nevytváří konstruktorem, ale s využitím metody třídy ```get()``` pomocné třídy ```Paths``` - POZOR! - Jedná se o jinou třídu než je rozhraní ```Path``` - Její metoda třídy ```get()``` vrací instanci rozhraní ```Path``` - ```Path cesta = Paths.get(retezecSCestou);``` - Např. ```Path soubor = Paths.get("data.txt");``` - Např. ```Path soubor = Paths.get("D:\\ppa1\\data.txt");``` - Je vhodné používat ```File.sepearator``` pro oddělení jednotlivých názvů adresářů - Absolutní cesta - Metoda ```toAbsolutePath()``` - Vrátí novou instanci ```Path``` reprezentující soubor nebo složku jako absolutní cestu - Pokud už současná instance je absolutní cesta, vrátí stejnou instanci - Pokud je současná instance relativní cesta, vytvoří z ní absolutní doplněním aktuálního adresáře (složky) - Zjištění jména souboru či adresáře (složky) - Metoda ```getFileName()``` - Vrátí poslední položku cesty (za posledním oddělovačem) - Pokud je cesta ukončena oddělovačem, nevadí to, metoda stejně vrátí poslední položku cesty, nikoliv prázdný řetězec - Převod na ```File``` (dříve používáno místo ```Path```) a obráceně - Metoda instance ```Path.toFile()``` - Převede instanci ```Path``` na instanci ```File``` - Metoda instance ```File.toPath()``` - Převede instanci ```File``` na instanci ```Path``` - Převod na řetězec - Standardní metoda ```toString()``` #### Práce se souborem nebo adresářem pomocí třídy Files - Třída ```Files``` obsahuje mj. metody pro práci se souborem či adresářem jako celkem - Jedná se o metody třídy a jako parametr mají instanci rozhraní ```Path``` určující, s jakým souborem mají pracovat - Metody třídy ```Files``` pro práci se soubory a adresáři jako s celkem obecně vyhazují konkrétní výjimku odvozenou typicky od ```IOException```, podle toho, k jakému problému dojde - Zjištění existence souboru - Metoda ```Files.exists(soubor)``` - Vrátí ```true```, pokud zadaný soubor nebo adresář (instance ```Path```) fyzicky existuje na disku, jinak vrátí ```false``` - Zjištění, zda se jedná o adresář - Metoda ```Files.isDirectory(soubor)``` - Vrací ```true```, pokud je zadaný souboru (instance ```Path```) adresář - Pokud objekt neexistuje, nebo je to soubor, vrací ```false``` - Zjištění informací o souboru nebo adresáři - Metoda ```Files.getLastModifiedTime(soubor)``` - Vrátí datum a čas poslední modifikace zadaného souboru nebo adresáře jako instanci třídy ```FileTime``` - Metoda ```toString()``` této třídy vrací datum a čas v čitelném formátu - Pro neexistující soubory nebo adresáře vyhodí výjimku - Metoda ```Files.size(soubor)``` - Vrátí velikost souboru v bytech - Pro neexistující soubor vyhodí výjimku - Pro adresář vrátí 0 - Smazání souboru či adresáře - Metoda ```Files.delete(soubor``` - Smaže soubor nebo adresář - Pokud soubor nebo adresář neexistuje, nebo adresář není prázdný, vyhodí výjimku - Přejmenování/přesunutí souboru či adresáře - Metoda ```Files.move(původníSoubor, cílovýSoubor)``` - Přejmenuje nebo přesune soubor nebo adresář - Při neúspěchu (např. cílový soubor již existuje) vyhodí výjimku - Kopírování souboru či adresáře - Metoda ```Files.copy(původníSoubor, cílovýSoubor)``` - Překopíruje soubor nebo adresář - Pokud se jedná o adresář, nezkopíruje se jeho obsah - Při neúspěchu vyhodí výjimku - Vytvoření adresáře - Metoda ```createDirectories(adresář)``` - Vytvoří adresář (v případě nutnosti všechny dosud neexistující adresáře v cestě) - Při neúspěchu vyhodí výjimku