Уважаемые гуру не могли бы вы мне подсказать…правильным я путем пойду если буду использовать вот этот класс для работы с файлами:
class MyFile{
// любой вызываемый метод класса
// прекращает работу если $error true
public $error = false;
// дескриптор заблокированного файла
// массив строк файла
// и путь к копии файла (создается при подготоовке файла к записи)
// путь к файлу
public $file_block;
public $file_data = array();
private $file_bak_path;
public $file_path;
// закрываем файл
function __destruct(){
if (is_resource($this->file_block)) {
fclose($this->file_block);
}
}
public function prepareFileWrite($filename){
if (!$this->error) {
try{
$this->file_path = $filename;
$this->file_bak_path = $filename.".bak";
// пытаемся создать копию файла
if (!copy($this->file_path, $this->file_bak_path)){
throw new Exception("Невозможно создать копию файла.", 7);
}
// пытаемся открыть файл
$this->file_block = fopen($this->file_path, "r+t");
if (!is_resource($this->file_block)) {
throw new Exception("Невозможно открыть указанный файл.", 8);
}
// пытаемся установить блокировку
if (!flock($this->file_block, LOCK_EX)) {
throw new Exception("Невозможно установить исключительную блокировку на файл.", 9);
}
// получаем размер файла
if (($size = filesize($this->file_path)) === false) {
throw new Exception("Невозможно получить размер файла.", 10);
}
// записываем в массив все строки файла
$data = array();
if ($size > 0) {
if (!$get_string = fread($this->file_block, $size)) {
throw new Exception("Невозможно прочитать файл.", 11);
}
$data = explode("\n", $get_string);
}
foreach($data as $value) {
$this->file_data[] = rtrim($value);
}
}
catch (Exception $e){
$this->error = $e->getCode();
if ($e->getCode() >= 8 and $e->getCode() <= 11) {
unlink($this->file_bak_path);
}
}
}
}
public function WriteInFile($data){
if (!$this->error) {
try{
if ( fseek($this->file_block,0,0) === -1) {
throw new Exception("Невозможно установить указатель на начало файла.", 12);
}
if (!ftruncate($this->file_block,0)) {
throw new Exception("Невозможно очистить файл.", 13);
}
if (fwrite($this->file_block, $data) === false) {
throw new Exception("Не удалось записать в файл.", 14);
}
if (!fflush($this->file_block)) {
throw new Exception("Не удалось очистить буфер.", 15);
}
unlink($this->file_bak_path);
}
catch (Exception $e) {
$this->error = $e->getCode();
if ($e->getCode() >= 12 and $e->getCode() <= 15) {
flock($this->file_block, LOCK_UN);
copy($this->file_bak_path, $this->file_path);
unlink($this->file_bak_path);
}
}
}
}
}
а теперь вызываем
$test = new MyFile();
$test->prepareFileWrite("test.txt" );
$test->WriteInFile("записано");
Вот вроде все работает…буду Вам очень благодарен если укажите на ошибки или может какие улучшения для этого класса