1<?php 2 3namespace Sabre\DAV\FS; 4 5use Sabre\DAV; 6 7/** 8 * Directory class 9 * 10 * @copyright Copyright (C) fruux GmbH (https://fruux.com/) 11 * @author Evert Pot (http://evertpot.com/) 12 * @license http://sabre.io/license/ Modified BSD License 13 */ 14class Directory extends Node implements DAV\ICollection, DAV\IQuota { 15 16 /** 17 * Creates a new file in the directory 18 * 19 * Data will either be supplied as a stream resource, or in certain cases 20 * as a string. Keep in mind that you may have to support either. 21 * 22 * After successful creation of the file, you may choose to return the ETag 23 * of the new file here. 24 * 25 * The returned ETag must be surrounded by double-quotes (The quotes should 26 * be part of the actual string). 27 * 28 * If you cannot accurately determine the ETag, you should not return it. 29 * If you don't store the file exactly as-is (you're transforming it 30 * somehow) you should also not return an ETag. 31 * 32 * This means that if a subsequent GET to this new file does not exactly 33 * return the same contents of what was submitted here, you are strongly 34 * recommended to omit the ETag. 35 * 36 * @param string $name Name of the file 37 * @param resource|string $data Initial payload 38 * @return null|string 39 */ 40 function createFile($name, $data = null) { 41 42 $newPath = $this->path . '/' . $name; 43 file_put_contents($newPath, $data); 44 clearstatcache(true, $newPath); 45 46 } 47 48 /** 49 * Creates a new subdirectory 50 * 51 * @param string $name 52 * @return void 53 */ 54 function createDirectory($name) { 55 56 $newPath = $this->path . '/' . $name; 57 mkdir($newPath); 58 clearstatcache(true, $newPath); 59 60 } 61 62 /** 63 * Returns a specific child node, referenced by its name 64 * 65 * This method must throw DAV\Exception\NotFound if the node does not 66 * exist. 67 * 68 * @param string $name 69 * @throws DAV\Exception\NotFound 70 * @return DAV\INode 71 */ 72 function getChild($name) { 73 74 $path = $this->path . '/' . $name; 75 76 if (!file_exists($path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located'); 77 78 if (is_dir($path)) { 79 80 return new self($path); 81 82 } else { 83 84 return new File($path); 85 86 } 87 88 } 89 90 /** 91 * Returns an array with all the child nodes 92 * 93 * @return DAV\INode[] 94 */ 95 function getChildren() { 96 97 $nodes = []; 98 $iterator = new \FilesystemIterator( 99 $this->path, 100 \FilesystemIterator::CURRENT_AS_SELF 101 | \FilesystemIterator::SKIP_DOTS 102 ); 103 foreach ($iterator as $entry) { 104 105 $nodes[] = $this->getChild($entry->getFilename()); 106 107 } 108 return $nodes; 109 110 } 111 112 /** 113 * Checks if a child exists. 114 * 115 * @param string $name 116 * @return bool 117 */ 118 function childExists($name) { 119 120 $path = $this->path . '/' . $name; 121 return file_exists($path); 122 123 } 124 125 /** 126 * Deletes all files in this directory, and then itself 127 * 128 * @return void 129 */ 130 function delete() { 131 132 foreach ($this->getChildren() as $child) $child->delete(); 133 rmdir($this->path); 134 135 } 136 137 /** 138 * Returns available diskspace information 139 * 140 * @return array 141 */ 142 function getQuotaInfo() { 143 $absolute = realpath($this->path); 144 return [ 145 disk_total_space($absolute) - disk_free_space($absolute), 146 disk_free_space($absolute) 147 ]; 148 149 } 150 151} 152