| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359 |
- <?php
- //define(MAX_FILES_TO_SORT, 5);
- //define(LISTING_TIMEOUT, 0.000001);
- define(LISTING_TIMEOUT, 5);
- //echo 'files: ';
- //$files = scandir(__DIR__);
- //echo '<pre>';
- //print_r($files);
- //$_REQUEST['sort_field'] = 'size';
- $_REQUEST['sort_field'] = 'name';
- //$_REQUEST['sort_field'] = 'atime';
- //$_REQUEST['sort_field'] = 'mtime';
- $_REQUEST['sort_desc'] = 1;
- /*
- +- copy file / dir [ recursive ]
- +- rename(move) file / dir
- +- delete file / dir [ recursive ]
- +- chmod file / dir
- +- chown file / dir
- +- create file
- +- create dir
- */
- switch($_REQUEST['action']){
- case 'copy': fm_copy($_REQUEST['source'], $_REQUEST['dest']); break;
- case 'rename': fm_rename($_REQUEST['source'], $_REQUEST['dest']); break;
- case 'delete': fm_delete($_REQUEST['source']); break;
- case 'chmod': fm_chmod($_REQUEST['source'], $_REQUEST['mode']); break;
- case 'chown': fm_chown($_REQUEST['source'], $_REQUEST['uid'], $_REQUEST['gid']); break;
- case 'create_file': fm_create_file($_REQUEST['source'], $_REQUEST['mode'] || FALSE); break;
- case 'create_dir': fm_create_dir($_REQUEST['source'], $_REQUEST['mode'] || FALSE); break;
- default:
- $pwd = $_REQUEST['path'] ? $_REQUEST['path'] : __DIR__;
- $listing = dir_list($pwd, $_REQUEST['sort_field']);
- $writable = is_writable($pwd);
- $pwd = array_merge(array('/'), explode('/', trim($pwd, '/')));
- include('templates/filemanager.php');
- break;
- }
- //echo $_GET['sort_field'];
- // if(in_array($_GET['sort_field'], $available_sort_fields)){
- // echo '1';
- // }
- /*
- upload_file
- + list_dir
- +- copy file / dir [ recursive ]
- +- rename(move) file / dir
- +- delete file / dir [ recursive ]
- +- chmod file / dir
- +- chown file / dir
- +- create file
- +- create dir
- view file / image
- download file / image
- */
- function fm_create_file($filename){
- if(is_file($filename))
- return array('error' => 'file exists', 'code' => 1);
- return !!fopen($filename, 'w');
- }
- function fm_create_dir($dirname){
- if(is_dir($filename))
- return array('error' => 'directory exists', 'code' => 1);
- // TODO set parent directory mode
- return mkdir($dirname);
- }
- function fm_chown($filename, $recursive = 0, $uid = FALSE, $gid = FALSE){
- if(is_dir($filename) && $recursive){
- $dir_handle = opendir($dir);
- while ($item = readdir($dir_handle)){
- if (!in_array($item, array('.','..'))){
- $new_item = $filename.'/'.$item;
- if($uid !== FALSE) chown($new_item, (int)$uid);
- if($gid !== FALSE) chgrp($new_item, (int)$gid);
- if(is_dir($new_item)){
- fm_chown($new_item, $recursive, $uid, $gid);
- }
- }
- }
- }else{
- if($uid !== FALSE) chown($filename, (int)$uid);
- if($gid !== FALSE) chgrp($filename, (int)$gid);
- }
- }
- function fm_chmod($filename, $recursive = 0, $mode){
- if(is_dir($filename) && $recursive){
- $dir_handle = opendir($dir);
- while ($item = readdir($dir_handle)){
- if (!in_array($item, array('.','..'))){
- $new_item = $filename.'/'.$item;
- chmod($new_item, octdec($mode));
- if(is_dir($new_item)){
- fm_chmod($new_item, $recursive, $mode);
- }
- }
- }
- }else{
- chmod($filename, octdec($mode));
- }
- }
- function fm_delete($filename){
- if(is_dir($filename)){
- foreach (
- $iterator = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($filename, RecursiveDirectoryIterator::SKIP_DOTS),
- RecursiveIteratorIterator::SELF_FIRST) as $item
- ) {
- if ($item->isDir()) {
- rmdir($item);
- // mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName(), decoct(fileperms($item->getPerms())));
- } else {
- unlink($item);
- // copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
- }
- }
- }else{
- return unlink($filename);
- }
- }
- function fm_rename($source, $dest){
- return rename($source, $dest);
- }
- function fm_copy($source, $dest){
- if(is_dir($source)){
- foreach (
- $iterator = new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
- RecursiveIteratorIterator::SELF_FIRST) as $item
- ) {
- if ($item->isDir()) {
- // TODO set dir perms
- mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName(), decoct(fileperms($item->getPerms())));
- } else {
- copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
- }
- }
-
- }else{
- return copy($source, $dest);
- }
- }
- function list_dir(){
- $dir_iterator = new RecursiveDirectoryIterator("/path");
- $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);
- // could use CHILD_FIRST if you so wish
- foreach ($iterator as $file) {
- echo $file, "\n";
- }
- $size = 0;
- foreach ($iterator as $file) {
- if ($file->isFile()) {
- echo substr($file->getPathname(), 27) . ": " . $file->getSize() . " B; modified " . date("Y-m-d", $file->getMTime()) . "\n";
- $size += $file->getSize();
- }
- }
- echo "\nTotal file size: ", $size, " bytes\n";
- }
- /// fast removing directory
- function rmrf($dir) {
-
- foreach (glob($dir) as $file) {
- if (is_dir($file)) {
- rmrf("$file/*");
- rmdir($file);
- } else {
- unlink($file);
- }
- }
- }
- function dir_list($dir, $sort = 0)
- {
- $sort_order_for_filename = SORT_ASC;
- //$available_sort_fields = array('size, type', 'mtime', 'atime', 'owner', 'group');
- $available_sort_fields = array('name', 'size', 'type', 'mtime', 'atime', 'owner', 'group');
- $sort_order = SORT_ASC;
- if ($dir[strlen($dir)-1] != '/') $dir .= '/';
- if (!is_dir($dir)) return array();
- $start = microtime(TRUE);
- $listing = array('dirs' => array(), 'files' => array(), 'dir_names' => array(), 'file_names' => array() ,'count' => 0, 'timeout_exeeded' => 0, 'time' => 0);
- $dir_handle = opendir($dir);
- $dir_objects = array();
- while ($object = readdir($dir_handle)){
- if (!in_array($object, array('.','..'))){
- $filename = $dir . $object;
- $time = microtime(true) - $start;
- if($time <= LISTING_TIMEOUT){
- $stats = stat($filename);
- $mode = explain_mode($stats['mode']);
- $perms = decoct(fileperms($filename));
- $item = array(
- 'name' => $object,
- 'size' => $stats['size'],
- 'mode' => array('owner' => $mode['owner'], 'group' => $mode['owner'], 'other' => $mode['owner']),
- 'perms' => decoct($stats['mode']),
- 'type' => $mode['type'],
- 'mtime' => $stats['mtime'],
- 'atime' => $stats['atime'],
- 'mdate_human' => date("Y F d", $stats['mtime']),
- 'mtime_human' => date("H:i:s", $stats['mtime']),
- 'adate_human' => date("Y F d", $stats['atime']),
- 'atime_human' => date("H:i:s", $stats['atime']),
- 'nlink' => $stats['nlink'],
- 'owner' => posix_getpwuid($stats['uid'])['name'],
- 'group' => posix_getgrgid($stats['gid'])['name']
- );
- }else{
- $listing['timeout_exeeded'] = TRUE;
- if(is_dir($filename)){ $type = 'd';
- }else{ $type = '-'; }
- $item = array(
- 'name' => $object,
- 'size' => FALSE,
- 'mode' => array('owner' => FALSE, 'group' => FALSE, 'other' => FALSE),
- 'type' => $type,
- 'mtime' => FALSE,
- 'atime' => FALSE,
- 'mdate_human' => FALSE,
- 'mtime_human' => FALSE,
- 'adate_human' => FALSE,
- 'atime_human' => FALSE,
- 'nlink' => FALSE,
- 'owner' => FALSE,
- 'group' => FALSE
- );
- }
- $listing['count']++;
- if($item['type'] == 'd'){
- $listing['dirs'][] = $item;
- $listing['dir_names'][] = $item['name'];
- }else{
- if($sort && !$listing['timeout_exeeded']){
- $listing[$sort][] = $item[$sort];
- }
- $listing['files'][] = $item;
- $listing['file_names'][] = $item['name'];
- }
- }
- }
- $listing['time'] = microtime(TRUE) - $start;
- if(!$listing['timeout_exeeded']){
- if(in_array($_REQUEST['sort_field'], $available_sort_fields)){
- if($_REQUEST['sort_desc']){
- $sort_order = SORT_DESC;
- }
- array_multisort($listing[$_REQUEST['sort_field']], $sort_order, $listing['file_names'], $sort_order_for_filename, $listing['files']);
- }
- array_multisort($listing['dir_names'], $sort_order_for_filename, $listing['dirs']);
- }
- return $listing;
- }
-
- function explain_mode($mode)
- {
- $info = array();
-
- if (($mode & 0xC000) == 0xC000) { $info['type'] = 's'; }
- elseif (($mode & 0xA000) == 0xA000) { $info['type'] = 'l'; }
- elseif (($mode & 0x8000) == 0x8000) { $info['type'] = '-'; }
- elseif (($mode & 0x6000) == 0x6000) { $info['type'] = 'b'; }
- elseif (($mode & 0x4000) == 0x4000) { $info['type'] = 'd'; }
- elseif (($mode & 0x2000) == 0x2000) { $info['type'] = 'c'; }
- elseif (($mode & 0x1000) == 0x1000) { $info['type'] = 'p'; }
- else { $info['type'] = 'u'; }
- $info['owner'] = (($mode & 0x0100) ? 'r' : '-');
- $info['owner'] .= (($mode & 0x0080) ? 'w' : '-');
- $info['owner'] .= (($mode & 0x0040) ? (($mode & 0x0800) ? 's' : 'x' ) : (($mode & 0x0800) ? 'S' : '-'));
- // group
- $info['group'] = (($mode & 0x0020) ? 'r' : '-');
- $info['group'] .= (($mode & 0x0010) ? 'w' : '-');
- $info['group'] .= (($mode & 0x0008) ? (($mode & 0x0400) ? 's' : 'x' ) : (($mode & 0x0400) ? 'S' : '-'));
- // other
- $info['other'] = (($mode & 0x0004) ? 'r' : '-');
- $info['other'] .= (($mode & 0x0002) ? 'w' : '-');
- $info['other'] .= (($mode & 0x0001) ? (($mode & 0x0200) ? 't' : 'x' ) : (($mode & 0x0200) ? 'T' : '-'));
- return $info;
- }
- ?>
|