FileUtils.class.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************************
00003  *   Copyright (C) 2004-2008 by Sveta A. Smirnova                          *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU Lesser General Public License as        *
00007  *   published by the Free Software Foundation; either version 3 of the    *
00008  *   License, or (at your option) any later version.                       *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00017     final class FileUtils extends StaticFactory
00018     {
00023         public static function convertLineEndings(
00024             $dir, $ignore, $from = "\r\n", $to = "\n"
00025         )
00026         {
00027             $converted = 0;
00028 
00029             if (!is_dir($dir) || !is_readable($dir)) {
00030                 throw new WrongArgumentException();
00031             }
00032 
00033             $files = scandir($dir);
00034 
00035             foreach ($files as $file) {
00036                 if (
00037                     '.' != $file
00038                     && '..' != $file
00039                     &&
00040                     !in_array(
00041                         substr($file, strrpos($file, '.')), $ignore, true
00042                     )
00043                 ) {
00044                     if (is_dir($path = $dir . DIRECTORY_SEPARATOR . $file)) {
00045                         $converted += self::convertLineEndings(
00046                             $path, $ignore, $from, $to
00047                         );
00048                     } else {
00049                         file_put_contents(
00050                             $path,
00051                             preg_replace(
00052                                 "/$from/",
00053                                 $to,
00054                                 file_get_contents($path)
00055                             )
00056                         );
00057                         
00058                         ++$converted;
00059                     }
00060                 }
00061             }
00062 
00063             return $converted;
00064         }
00065 
00066         public static function makeTempFile(
00067             $where = 'file-utils/', $prefix = '', $mkdirMode = 0700
00068         )
00069         {
00070             $directory = ONPHP_TEMP_PATH.$where;
00071 
00072             if (!is_writable($directory))
00073                 if (!mkdir($directory, $mkdirMode, true))
00074                     throw new WrongArgumentException(
00075                         "can not write to '{$directory}'"
00076                     );
00077 
00078             $result = tempnam($directory, $prefix);
00079 
00080             if ($result === false)
00081                 throw new WrongArgumentException(
00082                     'failed to create temp file in '.$directory
00083                 );
00084             
00085             return $result;
00086         }
00087 
00088         public static function makeTempDirectory(
00089             $where = 'file-utils/', $prefix = '', $mode = 0700
00090         )
00091         {
00092             $directory = ONPHP_TEMP_PATH.$where;
00093 
00094             if (substr($directory, -1) != DIRECTORY_SEPARATOR)
00095                 $directory .= DIRECTORY_SEPARATOR;
00096 
00097             $attempts = 42; // it's more than enough ;)
00098 
00099             do {
00100                 --$attempts;
00101                 $path = $directory.$prefix.mt_rand();
00102             } while (
00103                 !mkdir($path, $mode, true)
00104                 && $attempts > 0
00105                 // not to rape fs
00106                 && !usleep(100)
00107             );
00108 
00109             if ($attempts == 0)
00110                 throw new WrongArgumentException(
00111                     'failed to create subdirectory in '.$directory
00112                 );
00113             
00114             return $path;
00115         }
00116         
00117         public static function makeUniqueName($fileName)
00118         {
00119             $extensionPosition = strrpos($fileName, '.');
00120             
00121             return
00122                 substr($fileName, 0, $extensionPosition)
00123                 .'_'.uniqid()
00124                 .substr($fileName, $extensionPosition);
00125         }
00126         
00127         /* void */ public static function removeDirectory($directory, $recursive = false)
00128         {
00129             if (!$recursive) {
00130                 try {
00131                     rmdir($directory);
00132                 } catch (BaseException $e) {
00133                     throw new WrongArgumentException($e->getMessage());
00134                 }
00135             } else {
00136                 $directoryIterator = new DirectoryIterator($directory);
00137                 
00138                 foreach ($directoryIterator as $file) {
00139                     if ($file->isDot())
00140                         continue;
00141                     
00142                     if ($file->isDir())
00143                         self::removeDirectory($file->getPathname(), $recursive);
00144                     elseif (!unlink($file->getPathname()))
00145                         throw new WrongStateException(
00146                             "cannot unlink {$file->getPathname()}"
00147                         );
00148                 }
00149                 
00150                 try {
00151                     rmdir($directory);
00152                 } catch (BaseException $e) {
00153                     throw new WrongStateException(
00154                         "cannot unlink {$directory}, though it should be empty now"
00155                     );
00156                 }
00157             }
00158         }
00159         
00160         public static function upload($source, $target)
00161         {
00162             if (
00163                 is_readable($source)
00164                 && is_writable(pathinfo($target, PATHINFO_DIRNAME))
00165             )
00166                 return move_uploaded_file($source, $target);
00167             
00168             throw new WrongArgumentException(
00169                 "can not move {$source} to {$target}"
00170             );
00171         }
00172         
00173         public static function move($source, $target)
00174         {
00175             if (
00176                 is_readable($source)
00177                 && is_writable(pathinfo($target, PATHINFO_DIRNAME))
00178             )
00179                 return rename($source, $target);
00180             
00181             throw new WrongArgumentException(
00182                 "can not move {$source} to {$target}"
00183             );
00184         }
00185         
00186         public static function unlink($filePath)
00187         {
00188             if (
00189                 file_exists($filePath)
00190                 && is_writable(pathinfo($filePath, PATHINFO_DIRNAME))
00191             )
00192                 return unlink($filePath);
00193             
00194             throw new WrongArgumentException(
00195                 "can not unlink {$filePath}"
00196             );
00197         }
00198     }
00199 ?>