Práce se soubory

před 10 lety

Papoušek
Člen | 16
+
0
-

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)

před 10 lety

jasir
Člen | 748
+
0
-

Hezké zapouzdření práce se soubory, přemýšlím že to vyzkouším až s nimi budu více pracovat. Díky za zveřejnění.

před 10 lety

Papoušek
Člen | 16
+
0
-

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)

před 10 lety

h4kuna
Backer | 706
+
0
-

Papoušek napsal(a):

Ještě bych dopolnil, že používaný oddělovač je definovaný ve File::SEPARATOR a je nastavený na „/“ (Linux).

existuje konstanta DIRECTORY_SEPARATOR ktera se meni podle systemu.

<?php
Debug::dump(DIRECTORY_SEPARATOR);
?>

před 10 lety

Papoušek
Člen | 16
+
0
-

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:

  1. Vytvoří instanci File
  2. Definuje filtr, kterému vyhovují pouze ZIP a RAR soubory
  3. Získá soubory vyhovující filtru
  4. Smaže tyto soubory

před 10 lety

Patrik Votoček
Člen | 2249
+
0
-

Papoušek napsal(a):

vrtak-cz:

Asi si nejsem jistý, jestli jsem tě dobře pochopil. Celý ten druhý příklad dělá tohle:

  1. Vytvoří instanci File
  2. Definuje filtr, kterému vyhovují pouze ZIP a RAR soubory
  3. Získá soubory vyhovující filtru
  4. 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)

před 10 lety

Papoušek
Člen | 16
+
0
-

vrtak-cz napsal(a):

Btw a tak me tak napada ta negace funguje (chci vybrat vsechny soubory ktere nejsou zip a rar)?

Neumí, ale je to hodně dobrý nápad. Bohužel nevím, jak celá ta magie s „~“ funguje.

před 10 lety

Patrik Votoček
Člen | 2249
+
0
-

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)

před 10 lety

Papoušek
Člen | 16
+
0
-

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ž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…

Supr, až bude čas, podívám se na to.

před 10 lety

David Grudl
Nette Core | 6873
+
0
-

Mimochodem přímo v PHP existuje SplFileInfo a SplFileObject