show size of folders in filebrowser
This commit is contained in:
parent
1495ec0f31
commit
318d024cc1
3 changed files with 71 additions and 2 deletions
|
@ -33,7 +33,7 @@
|
|||
<tr>
|
||||
<td class="selection"><input type="checkbox" /></td>
|
||||
<td class="filename"><a style="background-image:url(<?php if($file["type"] == "dir") echo mimetype_icon("dir"); else echo mimetype_icon($file["mime"]); ?>)" href="<?php if($file["type"] == "dir") echo link_to("files", "index.php?dir=".$file["directory"]."/".$file["name"]); else echo link_to("files", "download.php?file=".$file["directory"]."/".$file["name"]); ?>" title=""><?php echo $file["name"]; ?></a></td>
|
||||
<td class="filesize"><?php if($file["type"] != "dir" ) echo human_file_size($file["size"]); ?></td>
|
||||
<td class="filesize"><?php echo human_file_size($file["size"]); ?></td>
|
||||
<td class="date"><?php if($file["type"] != "dir") echo $file["date"]; ?></td>
|
||||
<td class="fileaction"><a href="" title=""><img src="images/drop-arrow.png" alt="+" /></a></td>
|
||||
</tr>
|
||||
|
|
|
@ -64,6 +64,7 @@ class OC_FILES {
|
|||
$file['directory']=$directory;
|
||||
$stat=OC_FILESYSTEM::stat($directory.'/'.$filename);
|
||||
$file=array_merge($file,$stat);
|
||||
$file['size']=OC_FILESYSTEM::filesize($directory.'/'.$filename);
|
||||
$file['mime']=OC_FILES::getMimeType($directory .'/'. $filename);
|
||||
$file['readable']=OC_FILESYSTEM::is_readable($directory .'/'. $filename);
|
||||
$file['writeable']=OC_FILESYSTEM::is_writeable($directory .'/'. $filename);
|
||||
|
|
|
@ -124,7 +124,11 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
|
|||
return $filetype;
|
||||
}
|
||||
public function filesize($path){
|
||||
return filesize($this->datadir.$path);
|
||||
if($this->is_dir($path)){
|
||||
return $this->getFolderSize($path);
|
||||
}else{
|
||||
return filesize($this->datadir.$path);
|
||||
}
|
||||
}
|
||||
public function is_readable($path){
|
||||
return is_readable($this->datadir.$path);
|
||||
|
@ -159,6 +163,7 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
|
|||
public function file_put_contents($path,$data){
|
||||
if($return=file_put_contents($this->datadir.$path,$data)){
|
||||
$this->notifyObservers($path,OC_FILEACTION_WRITE);
|
||||
$this->clearFolderSizeCache($path);
|
||||
}
|
||||
}
|
||||
public function unlink($path){
|
||||
|
@ -197,11 +202,13 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
|
|||
case 'x+':
|
||||
case 'a+':
|
||||
$this->notifyObservers($path,OC_FILEACTION_READ | OC_FILEACTION_WRITE);
|
||||
$this->clearFolderSizeCache($path);
|
||||
break;
|
||||
case 'w':
|
||||
case 'x':
|
||||
case 'a':
|
||||
$this->notifyObservers($path,OC_FILEACTION_WRITE);
|
||||
$this->clearFolderSizeCache($path);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -440,5 +447,66 @@ class OC_FILESTORAGE_LOCAL extends OC_FILESTORAGE{
|
|||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get the size of folder and it's content
|
||||
* @param string $path file path
|
||||
* @return int size of folder and it's content
|
||||
*/
|
||||
public function getFolderSize($path){
|
||||
$query=OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path=?");
|
||||
$size=$query->execute(array($path))->fetchAll();
|
||||
if(count($size)>0){// we already the size, just return it
|
||||
return $size[0]['size'];
|
||||
}else{//the size of the folder isn't know, calulate it
|
||||
return $this->calculateFolderSize($path);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief calulate the size of folder and it's content and cache it
|
||||
* @param string $path file path
|
||||
* @return int size of folder and it's content
|
||||
*/
|
||||
public function calculateFolderSize($path){
|
||||
$size=0;
|
||||
if ($dh = $this->opendir($path)) {
|
||||
while (($filename = readdir($dh)) !== false) {
|
||||
if($filename!='.' and $filename!='..'){
|
||||
$subFile=$path.'/'.$filename;
|
||||
if($this->is_file($subFile)){
|
||||
$size+=$this->filesize($subFile);
|
||||
}else{
|
||||
$size+=$this->calculateFolderSize($subFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
$query=OC_DB::prepare("SELECT size FROM *PREFIX*foldersize WHERE path=?");
|
||||
$hasSize=$query->execute(array($path))->fetchAll();
|
||||
if(count($hasSize)>0){// yes, update it
|
||||
$query=OC_DB::prepare("UPDATE *PREFIX*foldersize SET size=? WHERE path=?");
|
||||
$result=$query->execute(array($size,$path));
|
||||
}else{// no insert it
|
||||
$query=OC_DB::prepare("INSERT INTO *PREFIX*foldersize VALUES(?,?)");
|
||||
$result=$query->execute(array($path,$size));
|
||||
}
|
||||
}
|
||||
return $size;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief clear the folder size cache of folders containing a file
|
||||
* @param string $path
|
||||
*/
|
||||
public function clearFolderSizeCache($path){
|
||||
$path=dirname($path);
|
||||
$query=OC_DB::prepare("DELETE FROM *PREFIX*foldersize WHERE path = ?");
|
||||
$result=$query->execute(array($path));
|
||||
if($path!='/'){
|
||||
$parts=explode('/');
|
||||
array_pop($parts);
|
||||
$parent=implode('/',$parts);
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
Loading…
Reference in a new issue