diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php index 0bf6ad2d3d..435fcb692a 100644 --- a/lib/filestorage/local.php +++ b/lib/filestorage/local.php @@ -29,22 +29,15 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{ return is_file($this->datadir.$path); } public function stat($path) { - $fullPath = $this->datadir.$path; + $fullPath = $this->datadir . $path; $statResult = stat($fullPath); - // special case for 32-bit systems - if (PHP_INT_SIZE===4) { - if (!(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')) - $size = (float)exec('stat -c %s '. escapeshellarg ($fullPath)); - else{ - $fsobj = new COM("Scripting.FileSystemObject"); - $f = $fsobj->GetFile($fullPath); - $size = $f->Size; - } - + if ($statResult['size'] < 0) { + $size = self::getFileSizeFromOS($fullPath); $statResult['size'] = $size; $statResult[7] = $size; } + return $statResult; return $statResult; } @@ -59,7 +52,13 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{ if($this->is_dir($path)) { return 0; }else{ - return filesize($this->datadir.$path); + $fullPath = $this->datadir . $path; + $fileSize = filesize($fullPath); + if ($fileSize < 0) { + return self::getFileSizeFromOS($fullPath); + } + + return $fileSize; } } public function isReadable($path) { @@ -173,6 +172,30 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{ return $return; } + private static function getFileSizeFromOS($fullPath) { + $name = strtolower(php_uname('s')); + // Windows OS: we use COM to access the filesystem + if (strpos($name, 'win') !== false) { + if (class_exists('COM')) { + $fsobj = new COM("Scripting.FileSystemObject"); + $f = $fsobj->GetFile($fullPath); + return $f->Size; + } + } else if (strpos($name, 'bsd') !== false) { + if (\OC_Helper::is_function_enabled('exec')) { + return (float)exec('stat -f %z ' . escapeshellarg($fullPath)); + } + } else if (strpos($name, 'linux') !== false) { + if (\OC_Helper::is_function_enabled('exec')) { + return (float)exec('stat -c %s ' . escapeshellarg($fullPath)); + } + } else { + OC_Log::write('core', 'Unknown OS: '.$name, OC_Log::ERROR); + } + + return 0; + } + public function hash($path, $type, $raw=false) { return hash_file($type, $this->datadir.$path, $raw); }