Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: flat-file

mikaelh [07.11.2002 18:13:46]

#

Tässä on yksinkertainen flat-file skripti. Flat-file skriptiä käyttää esimerkiksi edgeBoard.
Flat-file skripti tallentaa monta tiedostoa yhteen tiedostoon. Elikkä toimii samalla lailla kuin UNIXin tar-ohjelma.

flatfile.php

<?php
/*
 * Yksinkertainen flat-file skripti
 * Tehnyt: mikaelh
 * http://koti.mbnet.fi/mikaelh
 * Saa käyttää vapaasti skripteissä, joiden lähdekoodi on saatavilla.
 */
class flatfile {
	var $tiedostots;
	var $tiedostotn;
	function tyhjenna() {
		$this->tiedostots = array();
		$this->tiedostotn = array();
	}
	function lue($tiedosto) {
		if (file_exists($tiedosto)) {
			$tiedoston_sisalto = file($tiedosto);
			$tiedostojen_maara = (int) trim($tiedoston_sisalto[0]);
			$tiedostotk = array();
			$alkutietojen_pituus = strlen($tiedoston_sisalto[0]);
			for ($i = 0; $i < $tiedostojen_maara; $i++) {
				list($nimi, $koko) = explode("|", trim($tiedoston_sisalto[$i+1]));
				array_push($this->tiedostotn, $nimi);
				array_push($tiedostotk, $koko);
				array_push($this->tiedostots, "");
				$alkutietojen_pituus += strlen($tiedoston_sisalto[$i+1]);
			}
			unset($tiedoston_sisalto);
			$place = 0;
			$fp = @fopen($tiedosto, "r");
			for ($i = 0; $i < $tiedostojen_maara; $i++) {
				fseek($fp, ($alkutietojen_pituus+$place));
				$this->tiedostots[$i] = fread($fp, $tiedostotk[$i]);
				$place += $tiedostotk[$i];
			}
			fclose($fp);
			return(true);
		}
		return(false);
	}
	function tallenna($tiedosto) {
		$uusi_tiedosto = "";
		$uusi_tiedosto .= (count($this->tiedostotn)."\n");
		foreach ($this->tiedostotn as $key => $value) {
			$uusi_tiedosto .= ($value."|".strlen($this->tiedostots[$key])."\n");
		}
		foreach ($this->tiedostots as $key => $value) {
			$uusi_tiedosto .= $value;
		}
		$fp = @fopen($tiedosto, "w");
		if (!$fp) return(false);
		fwrite($fp, $uusi_tiedosto);
		fclose($fp);
		return(true);
	}
	function avaa_tiedosto($nimi) {
		$etsi = array_search($nimi, $this->tiedostotn);
		if (is_null($etsi) || $etsi === false) return(false);
		return($this->tiedostots[$etsi]);
	}
	function lisaa_tiedosto($nimi, $sisalto) {
		$etsi = array_search($nimi, $this->tiedostotn);
		if (!is_null($etsi) && $etsi !== false) return(false);
		if (strstr($nimi, "|") !== false) return(false);
		if (strstr($nimi, "\n") !== false) return(false);
		array_push($this->tiedostotn, $nimi);
		array_push($this->tiedostots, $sisalto);
		return(true);
	}
	function poista_tiedosto($nimi) {
		$etsi = array_search($nimi, $this->tiedostotn);
		if (is_null($etsi) || $etsi === false) return(false);
		array_splice($this->tiedostotn, $etsi, 1);
		array_splice($this->tiedostots, $etsi, 1);
		return(true);
	}
	function korvaa_tiedosto($nimi, $sisalto) {
		$etsi = array_search($nimi, $this->tiedostotn);
		if (is_null($etsi) || $etsi === false) return(false);
		$this->tiedostots[$etsi] = $sisalto;
		return(true);
	}
	function tiedosto_olemassa($nimi) {
		$etsi = array_search($nimi, $this->tiedostotn);
		if (is_null($etsi) || $etsi === false) return(false);
		return(true);
	}
}
?>

testi.php

<?php
//Flat-filen testaus skripti
include("flatfile.php");
$flatfile = new flatfile;
$flatfile->tyhjenna();
if (!file_exists("testit.txt")) {
	$flatfile->lisaa_tiedosto("testi.txt", "Tää on tälläinen testi vain.");
	$flatfile->lisaa_tiedosto("testi2.txt", "Tää on toinen testi.");
	$flatfile->lisaa_tiedosto("testi3.txt", "Tässä on testissä on myös rivinvaihto.\nTää on sen rivinvaihdon jälkeen.");
	$flatfile->tallenna("testit.txt");
}
else {
	$flatfile->lue("testit.txt");
	echo($flatfile->avaa_tiedosto("testi.txt")."\n");
	echo($flatfile->avaa_tiedosto("testi2.txt")."\n");
	echo($flatfile->avaa_tiedosto("testi3.txt")."\n");
}
?>

testit.txt

testaus skriptin tulos:
3
testi.txt|28
testi2.txt|20
testi3.txt|71
Tää on tälläinen testi vain.Tää on toinen testi.Tässä on testissä on myös rivinvaihto.
Tää on sen rivinvaihdon jälkeen.

mikaelh [08.11.2002 22:01:42]

#

Kommentteja, kiitos.
(Näinhän ne kaikki sanovat)

Antti Laaksonen [08.11.2002 22:04:16]

#

Ihan toimivan näköisiä funktioita.

Ville [08.11.2002 22:39:35]

#

Kätsy!

snakari [09.11.2002 10:10:37]

#

joo, en nyt jääny testaan, mutta rekisteröityminen rulz :D

GeoHound [03.02.2003 15:57:14]

#

jeeee

odys [23.06.2003 15:02:45]

#

Ihan kivan näköistä koodia ja varmasti jollekkin on hyötyä

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta