Merge pull request #20968 from Hystepik/develop#2

New : function dol_move_dir in htdocs/core/lib/files.lib.php
This commit is contained in:
Laurent Destailleur 2022-05-25 19:06:57 +02:00 committed by GitHub
commit 4cca69706a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 131 additions and 0 deletions

View File

@ -964,6 +964,69 @@ function dol_move($srcfile, $destfile, $newmask = 0, $overwriteifexists = 1, $te
return $result;
}
/**
* Move a directory into another name.
*
* @param string $srcdir Source directory
* @param string $destdir Destination directory
* @param int $overwriteifexists Overwrite directory if exists (1 by default)
* @param int $indexdatabase Index new file into database.
* @param int $renamedircontent Rename contents inside srcdir.
*
* @return boolean True if OK, false if KO
*/
function dol_move_dir($srcdir, $destdir, $overwriteifexists = 1, $indexdatabase = 1, $renamedircontent = 1)
{
global $user, $db, $conf;
$result = false;
dol_syslog("files.lib.php::dol_move_dir srcdir=".$srcdir." destdir=".$destdir." overwritifexists=".$overwriteifexists." indexdatabase=".$indexdatabase." renamedircontent=".$renamedircontent);
$srcexists = dol_is_dir($srcdir);
$srcbasename = basename($srcdir);
$destexists = dol_is_dir($destdir);
if (!$srcexists) {
dol_syslog("files.lib.php::dol_move_dir srcdir does not exists. we ignore the move request.");
return false;
}
if ($overwriteifexists || !$destexists) {
$newpathofsrcdir = dol_osencode($srcdir);
$newpathofdestdir = dol_osencode($destdir);
$result = @rename($newpathofsrcdir, $newpathofdestdir);
if ($result && $renamedircontent) {
if (file_exists($newpathofdestdir)) {
$destbasename = basename($newpathofdestdir);
$files = dol_dir_list($newpathofdestdir);
if (!empty($files) && is_array($files)) {
foreach ($files as $key => $file) {
if (!file_exists($file["fullname"])) continue;
$filepath = $file["path"];
$oldname = $file["name"];
$newname = str_replace($srcbasename, $destbasename, $oldname);
if (!empty($newname) && $newname !== $oldname) {
if ($file["type"] == "dir") {
$res = dol_move_dir($filepath.'/'.$oldname, $filepath.'/'.$newname, $overwriteifexists, $indexdatabase, $renamedircontent);
} else {
$res = dol_move($filepath.'/'.$oldname, $filepath.'/'.$newname);
}
if (!$res) {
return $result;
}
}
}
$result = true;
}
}
}
}
return $result;
}
/**
* Unescape a file submitted by upload.
* PHP escape char " (%22) or char ' (%27) into $FILES.

View File

@ -559,4 +559,72 @@ class FilesLibTest extends PHPUnit\Framework\TestCase
$user->rights->facture->lire = $savpermlire;
$user->rights->facture->creer = $savpermcreer;
}
/**
* testDolDirMove
*
* @return void
*/
public function testDolDirMove()
{
global $conf,$user,$langs,$db;
$conf=$this->savconf;
$user=$this->savuser;
$langs=$this->savlangs;
$db=$this->savdb;
// To test a move of empty directory that should work
$dirsrcpath = $conf->admin->dir_temp.'/directory';
$dirdestpath = $conf->admin->dir_temp.'/directory2';
$file=dirname(__FILE__).'/Example_import_company_1.csv';
dol_mkdir($dirsrcpath);
dol_delete_dir_recursive($dirdestpath, 0, 1);
$result=dol_move_dir($dirsrcpath, $dirdestpath, 1, 1, 1);
print __METHOD__." result=".$result."\n";
$this->assertTrue($result, 'move of directory with empty directory');
// To test a move on existing directory with overwrite
dol_mkdir($dirsrcpath);
$result=dol_move_dir($dirsrcpath, $dirdestpath, 1, 1, 1);
print __METHOD__." result=".$result."\n";
$this->assertTrue($result, 'move of directory on existing directory with empty directory');
// To test a move on existing directory without overwrite
dol_mkdir($dirsrcpath);
$result=dol_move_dir($dirsrcpath, $dirdestpath, 0, 1, 1);
print __METHOD__." result=".$result."\n";
$this->assertFalse($result, 'move of directory on existing directory without overwrite');
// To test a move with a file to rename in src directory
dol_mkdir($dirsrcpath);
dol_delete_dir_recursive($dirdestpath, 0, 1);
dol_copy($file, $dirsrcpath.'/directory_file.csv');
$result=dol_move_dir($dirsrcpath, $dirdestpath, 1, 1, 1);
print __METHOD__." result=".$result."\n";
$this->assertTrue($result, 'move of directory with file in directory');
// To test a move without a file to rename in src directory
dol_mkdir($dirsrcpath);
dol_delete_dir_recursive($dirdestpath, 0, 1);
dol_copy($file, $dirsrcpath.'/file.csv');
$result=dol_move_dir($dirsrcpath, $dirdestpath, 1, 1, 1);
print __METHOD__." result=".$result."\n";
$this->assertTrue($result, 'move of directory with file whitout rename needed in directory');
// To test a move with a directory to rename in src directory
dol_mkdir($dirsrcpath);
dol_delete_dir_recursive($dirdestpath, 0, 1);
dol_mkdir($dirsrcpath.'/directory');
$result=dol_move_dir($dirsrcpath, $dirdestpath, 1, 1, 1);
print __METHOD__." result=".$result."\n";
$this->assertTrue($result, 'move of directory with file with rename needed in directory');
// To test a move without a directory to rename in src directory
dol_mkdir($dirsrcpath);
dol_delete_dir_recursive($dirdestpath, 0, 1);
dol_mkdir($dirsrcpath.'/notorename');
$result=dol_move_dir($dirsrcpath, $dirdestpath, 1, 1, 1);
print __METHOD__." result=".$result."\n";
$this->assertTrue($result, 'move of directory with directory whitout rename needed in directory');
}
}