Qiang Xue
13 years ago
7 changed files with 216 additions and 234 deletions
@ -1,139 +0,0 @@
|
||||
<?php |
||||
/** |
||||
* Filesystem helper class file. |
||||
* |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright © 2008-2012 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\util; |
||||
|
||||
/** |
||||
* Filesystem helper |
||||
* |
||||
* @author Qiang Xue <qiang.xue@gmail.com> |
||||
* @author Alex Makarov <sam@rmcreative.ru> |
||||
* @since 2.0 |
||||
*/ |
||||
class File |
||||
{ |
||||
/** |
||||
* Copies a list of files from one place to another. |
||||
* @param array $fileList the list of files to be copied (name=>spec). |
||||
* The array keys are names displayed during the copy process, and array values are specifications |
||||
* for files to be copied. Each array value must be an array of the following structure: |
||||
* <ul> |
||||
* <li>source: required, the full path of the file/directory to be copied from</li> |
||||
* <li>target: required, the full path of the file/directory to be copied to</li> |
||||
* <li>callback: optional, the callback to be invoked when copying a file. The callback function |
||||
* should be declared as follows: |
||||
* <pre> |
||||
* function foo($source,$params) |
||||
* </pre> |
||||
* where $source parameter is the source file path, and the content returned |
||||
* by the function will be saved into the target file.</li> |
||||
* <li>params: optional, the parameters to be passed to the callback</li> |
||||
* </ul> |
||||
* @see buildFileList |
||||
*/ |
||||
public function copyFiles($fileList) |
||||
{ |
||||
$overwriteAll=false; |
||||
foreach($fileList as $name=>$file) |
||||
{ |
||||
$source=strtr($file['source'],'/\\',DIRECTORY_SEPARATOR); |
||||
$target=strtr($file['target'],'/\\',DIRECTORY_SEPARATOR); |
||||
$callback=isset($file['callback']) ? $file['callback'] : null; |
||||
$params=isset($file['params']) ? $file['params'] : null; |
||||
|
||||
if(is_dir($source)) |
||||
{ |
||||
$this->ensureDirectory($target); |
||||
continue; |
||||
} |
||||
|
||||
if($callback!==null) |
||||
$content=call_user_func($callback,$source,$params); |
||||
else |
||||
$content=file_get_contents($source); |
||||
if(is_file($target)) |
||||
{ |
||||
if($content===file_get_contents($target)) |
||||
{ |
||||
echo " unchanged $name\n"; |
||||
continue; |
||||
} |
||||
if($overwriteAll) |
||||
echo " overwrite $name\n"; |
||||
else |
||||
{ |
||||
echo " exist $name\n"; |
||||
echo " ...overwrite? [Yes|No|All|Quit] "; |
||||
$answer=trim(fgets(STDIN)); |
||||
if(!strncasecmp($answer,'q',1)) |
||||
return; |
||||
else if(!strncasecmp($answer,'y',1)) |
||||
echo " overwrite $name\n"; |
||||
else if(!strncasecmp($answer,'a',1)) |
||||
{ |
||||
echo " overwrite $name\n"; |
||||
$overwriteAll=true; |
||||
} else |
||||
{ |
||||
echo " skip $name\n"; |
||||
continue; |
||||
} |
||||
} |
||||
} else |
||||
{ |
||||
$this->ensureDirectory(dirname($target)); |
||||
echo " generate $name\n"; |
||||
} |
||||
file_put_contents($target,$content); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Builds the file list of a directory. |
||||
* This method traverses through the specified directory and builds |
||||
* a list of files and subdirectories that the directory contains. |
||||
* The result of this function can be passed to {@link copyFiles}. |
||||
* @param string $sourceDir the source directory |
||||
* @param string $targetDir the target directory |
||||
* @param string $baseDir base directory |
||||
* @return array the file list (see {@link copyFiles}) |
||||
*/ |
||||
public function buildFileList($sourceDir, $targetDir, $baseDir='') |
||||
{ |
||||
$list=array(); |
||||
$handle=opendir($sourceDir); |
||||
while(($file=readdir($handle))!==false) |
||||
{ |
||||
if($file==='.' || $file==='..' || $file==='.svn' ||$file==='.yii') |
||||
continue; |
||||
$sourcePath=$sourceDir.DIRECTORY_SEPARATOR.$file; |
||||
$targetPath=$targetDir.DIRECTORY_SEPARATOR.$file; |
||||
$name=$baseDir===''?$file : $baseDir.'/'.$file; |
||||
$list[$name]=array('source'=>$sourcePath, 'target'=>$targetPath); |
||||
if(is_dir($sourcePath)) |
||||
$list=array_merge($list,$this->buildFileList($sourcePath,$targetPath,$name)); |
||||
} |
||||
closedir($handle); |
||||
return $list; |
||||
} |
||||
|
||||
/** |
||||
* Creates all parent directories if they do not exist. |
||||
* @param string $directory the directory to be checked |
||||
*/ |
||||
public function ensureDirectory($directory) |
||||
{ |
||||
if(!is_dir($directory)) |
||||
{ |
||||
$this->ensureDirectory(dirname($directory)); |
||||
echo " mkdir ".strtr($directory,'\\','/')."\n"; |
||||
mkdir($directory); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,70 @@
|
||||
<?php |
||||
/** |
||||
* Filesystem helper class file. |
||||
* |
||||
* @link http://www.yiiframework.com/ |
||||
* @copyright Copyright © 2008-2012 Yii Software LLC |
||||
* @license http://www.yiiframework.com/license/ |
||||
*/ |
||||
|
||||
namespace yii\util; |
||||
|
||||
/** |
||||
* Filesystem helper |
||||
* |
||||
* @author Qiang Xue <qiang.xue@gmail.com> |
||||
* @author Alex Makarov <sam@rmcreative.ru> |
||||
* @since 2.0 |
||||
*/ |
||||
class FileHelper |
||||
{ |
||||
/** |
||||
* Returns the extension name of a file path. |
||||
* For example, the path "path/to/something.php" would return "php". |
||||
* @param string $path the file path |
||||
* @return string the extension name without the dot character. |
||||
*/ |
||||
public static function getExtension($path) |
||||
{ |
||||
return pathinfo($path, PATHINFO_EXTENSION); |
||||
} |
||||
|
||||
/** |
||||
* Returns the localized version of a specified file. |
||||
* |
||||
* The searching is based on the specified language code. In particular, |
||||
* a file with the same name will be looked for under the subdirectory |
||||
* whose name is same as the language code. For example, given the file "path/to/view.php" |
||||
* and language code "zh_cn", the localized file will be looked for as |
||||
* "path/to/zh_cn/view.php". If the file is not found, the original file |
||||
* will be returned. |
||||
* |
||||
* If the target and the source language codes are the same, |
||||
* the original file will be returned. |
||||
* |
||||
* For consistency, it is recommended that the language code is given |
||||
* in lower case and in the format of LanguageID_RegionID (e.g. "en_us"). |
||||
* |
||||
* @param string $file the original file |
||||
* @param string $targetLanguage the target language that the file should be localized to. |
||||
* If not set, the value of [[\yii\base\Application::language]] will be used. |
||||
* @param string $sourceLanguage the language that the original file is in. |
||||
* If not set, the value of [[\yii\base\Application::sourceLanguage]] will be used. |
||||
* @return string the matching localized file, or the original file if the localized version is not found. |
||||
* If the target and the source language codes are the same, the original file will be returned. |
||||
*/ |
||||
public static function localize($file, $targetLanguage = null, $sourceLanguage = null) |
||||
{ |
||||
if ($targetLanguage === null) { |
||||
$targetLanguage = \Yii::$application->getLanguage(); |
||||
} |
||||
if ($sourceLanguage === null) { |
||||
$sourceLanguage = \Yii::$application->sourceLanguage; |
||||
} |
||||
if ($targetLanguage === $sourceLanguage) { |
||||
return $file; |
||||
} |
||||
$desiredFile = dirname($file) . DIRECTORY_SEPARATOR . $sourceLanguage . DIRECTORY_SEPARATOR . basename($file); |
||||
return is_file($desiredFile) ? $desiredFile : $file; |
||||
} |
||||
} |
Loading…
Reference in new issue