Práce se soubory
- Papoušek
- Člen | 16
Zdravím,
v poslední době jsem musel trochu více pracovat se soubory a docela mi vadilo, že jsem mezi jednotlivými metodami musel předávat název souboru jako string. Další problém bylo jednoduché získávání typu souboru, procházení adresářů apod.
Inspirován Java API jsem si napsal pár tříd pro práci se soubory, především tedy deskriptor souboru – třídu File. Třídy jsou ke stažení zde.
Pár příkladů
Získání všech souborů z adresáře „/tmp“ s prefixem „prefix_“:
$file = new File("/tmp"); // Vytvoření nové instance
$filter = new FileNameFilter("prefix_*"); // Definování filtru
$files = $file->listFiles($filter); // Získání instancí souborů v adresáři
$paths = $file->listPaths($filter); // Získání cest k souborům v adresáři
Odstranění všech ZIP a RAR souborů z adresáře „/tmp“:
$dir = new File("/tmp"); // Vytvoření instance
$filter = new FileTypeFilter( // Definování filtru
array(
FileType::ZIP,
FileType::RAR
)
);
$files = $dir->listFiles($filter); // Získání požadovaných souborů
foreach($files AS $file) {
$file->delete(); // Smazání souborů
}
Repozitář
Třídy pro práci se soubory
svn checkout http://eskymofw.googlecode.com/svn/trunk/eskymo/io/files
Použité výjimky
svn checkout http://eskymofw.googlecode.com/svn/trunk/eskymo/exceptions
Editoval Papoušek (6. 8. 2009 12:33)
- Papoušek
- Člen | 16
Ještě bych dopolnil, že používaný oddělovač je definovaný ve
File::SEPARATOR
a je nastavený na „/“
(Linux).
FileTypeFilter a FileNameFilter implementují rozhraní IFileFilter. Pokud by vám tyto dva filtry nestačily, můžete si definovat vlastní (implementující toto rozhraní). Zrovna teď mě napadá třeba FileLastModifiedFilter nebo něco na ten způsob.
EDIT: Ten oddělovač byl na jednom místě špatně použit, tak jsem to opravil a auktualizoval odkaz v úvodním příspěvku.
Editoval Papoušek (6. 8. 2009 9:47)
- Papoušek
- Člen | 16
Doplnil jsem odkaz na repozitář.
matata napsal(a):
existuje konstanta DIRECTORY_SEPARATOR ktera se meni podle systemu.
To jsem nevěděl, přidal jsem to do repozitáře.
vrtak-cz:
Asi si nejsem jistý, jestli jsem tě dobře pochopil. Celý ten druhý příklad dělá tohle:
- Vytvoří instanci File
- Definuje filtr, kterému vyhovují pouze ZIP a RAR soubory
- Získá soubory vyhovující filtru
- Smaže tyto soubory
- Patrik Votoček
- Člen | 2221
Papoušek napsal(a):
vrtak-cz:
Asi si nejsem jistý, jestli jsem tě dobře pochopil. Celý ten druhý příklad dělá tohle:
- Vytvoří instanci File
- Definuje filtr, kterému vyhovují pouze ZIP a RAR soubory
- Získá soubory vyhovující filtru
- Smaže tyto soubory
Jeee sorry omlouvám se za demagogii nejak jsem to pochopil tak jako že to ma jenom vyfiltrovat seznam souboru ktere nejsou rar a zip… predchozi post mazu… Btw a tak me tak napada ta negace funguje (chci vybrat vsechny soubory ktere nejsou zip a rar)?
Editoval vrtak-cz (6. 8. 2009 13:32)
- Patrik Votoček
- Člen | 2221
Papoušek napsal(a):
Neumí, ale je to hodně dobrý nápad. Bohužel nevím, jak celá ta magie s „~“ funguje.
Koukám že v těch konstantách FileType::ZIP
atd. máš
čísla což je dobře. Protože FileType::ZIP = 1011;
a
~FileType::ZIP = -1012;
. Kdyby v tom byly řetězce bylo by to
o něčem jiném… Víc magie v tom nehledej…
Editoval vrtak-cz (6. 8. 2009 14:39)
- Papoušek
- Člen | 16
vrtak-cz napsal(a):
Papoušek napsal(a):
Neumí, ale je to hodně dobrý nápad. Bohužel nevím, jak celá ta magie s „~“ funguje.
Koukám že v těch konstantách
FileType::ZIP
atd. máš čísla což je dobře. ProtožeFileType::ZIP = 1011;
a~FileType::ZIP = -1012;
. Kdyby v tom byly řetězce bylo by to o něčem jiném… Víc magie v tom nehledej…
Supr, až bude čas, podívám se na to.