Práce se soubory

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
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)

jasir
Člen | 746
+
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í.

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)

h4kuna
Backer | 740
+
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);
?>
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
Patrik Votoček
Člen | 2221
+
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)

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.

Patrik Votoček
Člen | 2221
+
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)

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.

David Grudl
Nette Core | 8228
+
0
-

Mimochodem přímo v PHP existuje SplFileInfo a SplFileObject