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