PageRenderTime 107ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/filehandler.class.php

https://bitbucket.org/electric/php_classes_filehandler
PHP | 313 lines | 302 code | 9 blank | 2 comment | 5 complexity | e302195081f407d3d900772dc2e43958 MD5 | raw file
  1. <?php
  2. class FileHandler {
  3. public function __construct() { }
  4. public function __destruct() { }
  5. /* Helper functions */
  6. /* Begin Locking functions */
  7. private function __GetLock($type='rw') {
  8. $type == 'r' ? define("LOCK",LOCK_SH) : define("LOCK",LOCK_EX);
  9. while (!flock($this->fp, LOCK | LOCK_NB)) {
  10. usleep(round(rand(0, 100)*1000));
  11. }
  12. return(TRUE);
  13. }
  14. private function __ReleaseLock() {
  15. return(flock($this->fp, LOCK_UN));
  16. }
  17. private function __CheckLock() {
  18. $fp_try = fopen($this->file,'r');
  19. $try=0;
  20. while (!flock($fp_try, LOCK | LOCK_NB)) {
  21. usleep(round(rand(0, 100)*1000));
  22. if($try > 5) {
  23. return(TRUE);
  24. }
  25. $try++;
  26. }
  27. if($try < 5) {
  28. flock($fp_try,LOCK_UN);
  29. $this->error[] = "Don't have a lock";
  30. return(FALSE);
  31. }
  32. fclose($fp_try);
  33. }
  34. /* End Locking functions */
  35. private function __CloseFile() {
  36. return(fclose($this->fp));
  37. }
  38. private function __HaveFileOpen() {
  39. return(is_resource($this->fp));
  40. }
  41. private function __OpenFile($file,$mode) {
  42. if($this->__CheckFile($file,$mode)==TRUE) {
  43. $this->fp = fopen($file,$mode);
  44. if(!$this->fp) {
  45. $this->error[] = "unable to open file";
  46. return(FALSE);
  47. } else {
  48. return(TRUE);
  49. }
  50. } else {
  51. return(FALSE);
  52. }
  53. }
  54. private function __CheckFile($file,$mode) {
  55. $this->lock = $mode == 'r' ? 'r' : 'rw';
  56. if($mode == "r" || $mode == "r+" ) {
  57. if(file_exists($file)) {
  58. if(($this->lock == 'r' || $this->lock == 'rw') && is_readable($file) == FALSE) {
  59. //error
  60. $this->error[] = "File is not readable";
  61. return(FALSE);
  62. }
  63. if($this->lock == 'rw' && is_writeable($file) == FALSE) {
  64. // Error
  65. $this->error[] = "File is not writeable";
  66. return(FALSE);
  67. }
  68. } else {
  69. $this->error[] = "File does not exist";
  70. return(FALSE);
  71. }
  72. }
  73. return(TRUE);
  74. }
  75. private function __ReadFile() {
  76. $buff="";
  77. while(!feof($this->fp)) {
  78. $buff.=fread($this->fp,2048);
  79. }
  80. return($buff);
  81. }
  82. /* Filehandler functions */
  83. public function Open($file,$mode) {
  84. $this->file = $file;
  85. $this->mode = $mode;
  86. if($this->__OpenFile($this->file,$this->mode) == TRUE) {
  87. if($this->__HaveFileOpen() == TRUE) {
  88. if($this->__GetLock($this->lock) == TRUE ) {
  89. return(TRUE);
  90. }
  91. }
  92. }
  93. return(FALSE);
  94. }
  95. public function Close() {
  96. if($this->__HaveFileOpen() == TRUE) {
  97. if($this->__ReleaseLock() == FALSE) {
  98. $this->error[] = "Error in releasing lock";
  99. } else {
  100. if($this->__CloseFile() == FALSE) {
  101. $this->error[] = "Error in closing file";
  102. } else {
  103. return(TRUE);
  104. }
  105. }
  106. }
  107. return(FALSE);
  108. }
  109. public function Write($data) {
  110. if($this->__CheckLock() == TRUE && $this->__HaveFileOpen() == TRUE) {
  111. return(fwrite($this->fp,$data,strlen($data)));
  112. }
  113. }
  114. public function Read($line='') {
  115. if($this->__CheckLock() == TRUE && $this->__HaveFileOpen() == TRUE) {
  116. $buffer = "";
  117. while(!feof($this->fp)) {
  118. if($line != "") {
  119. $buffer[]=fgets($this->fp,1024);
  120. } else {
  121. $buffer.=fgets($this->fp,1024);
  122. }
  123. }
  124. if($line != "") {
  125. return(str_replace("\n","",$buffer[$line]));
  126. } else {
  127. return($buffer);
  128. }
  129. } else {
  130. return(FALSE);
  131. }
  132. }
  133. public function GetLineNo($string,$searchtype='is',$multi=FALSE,$sensitive=FALSE) {
  134. if($this->__CheckLock() == TRUE && $this->__HaveFileOpen() == TRUE) {
  135. $buffer = "";
  136. $found=0;
  137. $line=0;
  138. $found_lines = "";
  139. if($sensitive==TRUE) {
  140. $strsearch="strstr";
  141. } else {
  142. $strsearch="stristr";
  143. }
  144. while(!feof($this->fp)) {
  145. $buffer = fgets($this->fp,1024);
  146. switch($searchtype) {
  147. case'contains':
  148. if($strsearch(str_replace("\n","",$buffer),$string) == TRUE) $found=1;
  149. break;
  150. case'is':
  151. if(str_replace("\n","",$buffer) == $string) $found=1;
  152. break;
  153. case'notcontains':
  154. if(strsearch(str_replace("\n","",$buffer),$string) == FALSE) $found=1;
  155. break;
  156. case'notis':
  157. if(str_replace("\n","",$buffer) != $string) $found=1;
  158. break;
  159. default:
  160. $this->error[] = "Invalid Searchtype given";
  161. return(FALSE);
  162. break;
  163. }
  164. if($found==1) {
  165. if($multi==FALSE) {
  166. return($line);
  167. } else {
  168. $found_lines[]=$line;
  169. }
  170. $found=0;
  171. }
  172. $line++;
  173. }
  174. if($multi==TRUE) {
  175. return($found_lines);
  176. }
  177. } else {
  178. return(FALSE);
  179. }
  180. }
  181. public function ReplaceLine($lineno,$string) {
  182. if($this->__CheckLock() == TRUE && $this->__HaveFileOpen() == TRUE) {
  183. $multi = FALSE;
  184. $replace = FALSE;
  185. $buffer = "";
  186. $line = 0;
  187. $count = 0;
  188. if(is_array($lineno) && is_array($string)) {
  189. if(count($lineno) == count($string)) {
  190. $this->error[] = "Number of lines is not the same as number of strings";
  191. return(FALSE);
  192. }
  193. $multi = TRUE;
  194. }
  195. while(!feof($this->fp)) {
  196. if($multi == TRUE) {
  197. if($key = array_search($line,$lineno)) {
  198. $replace=TRUE;
  199. $buffer.=$string[$key];
  200. }
  201. } else {
  202. if($line == $lineno) {
  203. $replace=TRUE;
  204. $buffer.=$string;
  205. }
  206. }
  207. if($replace==FALSE) {
  208. $buffer.= fgets($this->fp,1024);
  209. } else {
  210. fgets($this->fp,1024);
  211. }
  212. $replace=FALSE;
  213. $line++;
  214. }
  215. $this->EmptyFile();
  216. $this->Write($buffer."\n");
  217. return(TRUE);
  218. } else {
  219. return(FALSE);
  220. }
  221. }
  222. Public function EmptyFile() {
  223. if($this->__CheckLock() == TRUE && $this->__HaveFileOpen() == TRUE) {
  224. return(ftruncate($this->fp,0));
  225. }
  226. }
  227. public function RemoveLine($lineno) {
  228. if($this->__CheckLock() == TRUE && $this->__HaveFileOpen() == TRUE) {
  229. $replace = FALSE;
  230. $multi = FALSE;
  231. $line = 0;
  232. $buffer = "";
  233. if(is_array($lineno)) $multi = TRUE;
  234. while(!feof($this->fp)) {
  235. if($multi == TRUE){
  236. if(array_search($line,$lineno)) {
  237. $replace = TRUE;
  238. }
  239. } else {
  240. if($line == $lineno) {
  241. $replace = TRUE;
  242. }
  243. }
  244. if($replace == FALSE) {
  245. $buffer.=fgets($this->fp,1024);
  246. } else {
  247. fgets($this->fp,1024);
  248. $replace = FALSE;
  249. }
  250. $line++;
  251. }
  252. $this->EmptyFile();
  253. $this->Write($buffer);
  254. return(TRUE);
  255. } else {
  256. return(FALSE);
  257. }
  258. }
  259. public function FileInfo() {
  260. if($this->__HaveFileOpen() == TRUE) {
  261. $fileinfo = fstat($this->fp);
  262. clearstatcache();
  263. return($fileinfo);
  264. }
  265. }
  266. public function GetErrors() {
  267. if(isset($this->error) && is_array($this->error) && !empty($this->error)) {
  268. for($i=0; $i < count($this->error); $i++) {
  269. echo "Error [$i]: ".$this->error[$i]."<br />\n";
  270. }
  271. return(TRUE);
  272. } else {
  273. return(FALSE);
  274. }
  275. }
  276. }
  277. ?>