+--------------------------------------------------------------------+
| CiviCRM version 4.6 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2014 |
+ | Copyright CiviCRM LLC (c) 2004-2015 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
-*/
+ */
/**
*
* @package CRM
- * @copyright CiviCRM LLC (c) 2004-2014
+ * @copyright CiviCRM LLC (c) 2004-2015
* $Id: $
*
*/
* @param string $name
* Name of file.
*
- * @return boolean true if file is ascii
+ * @return bool
+ * true if file is ascii
*/
public static function isAscii($name) {
$fd = fopen($name, "r");
* @param string $name
* Name of file.
*
- * @return boolean true if file is html
+ * @return bool
+ * true if file is html
*/
public static function isHtml($name) {
$fd = fopen($name, "r");
* Should we abort or just return an invalid code.
*
* @return void
- * @static
*/
public static function createDir($path, $abort = TRUE) {
if (is_dir($path) || empty($path)) {
*
* @throws Exception
* @return void
- * @static
*/
public static function cleanDir($target, $rmdir = TRUE, $verbose = TRUE) {
static $exceptions = array('.', '..');
throw new Exception("Overly broad deletion");
}
- if ($sourcedir = opendir($target)) {
- while (FALSE !== ($sibling = readdir($sourcedir))) {
+ if ($dh = @opendir($target)) {
+ while (FALSE !== ($sibling = readdir($dh))) {
if (!in_array($sibling, $exceptions)) {
$object = $target . DIRECTORY_SEPARATOR . $sibling;
elseif (is_file($object)) {
if (!unlink($object)) {
CRM_Core_Session::setStatus(ts('Unable to remove file %1', array(1 => $object)), ts('Warning'), 'error');
+ }
}
}
}
- }
- closedir($sourcedir);
+ closedir($dh);
if ($rmdir) {
if (rmdir($target)) {
CRM_Core_Session::setStatus(ts('Removed directory %1', array(1 => $target)), '', 'success');
}
return TRUE;
- }
+ }
else {
CRM_Core_Session::setStatus(ts('Unable to remove directory %1', array(1 => $target)), ts('Warning'), 'error');
+ }
+ }
}
}
+
+ /**
+ * Concatenate several files.
+ *
+ * @param array $files
+ * List of file names.
+ * @param string $delim
+ * An optional delimiter to put between files.
+ * @return string
+ */
+ public static function concat($files, $delim = '') {
+ $buf = '';
+ $first = TRUE;
+ foreach ($files as $file) {
+ if (!$first) {
+ $buf .= $delim;
+ }
+ $buf .= file_get_contents($file);
+ $first = FALSE;
}
+ return $buf;
}
/**
- * @param $source
- * @param $destination
+ * @param string $source
+ * @param string $destination
*/
- static function copyDir($source, $destination) {
- if ($dir = opendir($source)) {
+ public static function copyDir($source, $destination) {
+ if ($dh = opendir($source)) {
@mkdir($destination);
- while (FALSE !== ($file = readdir($dir))) {
+ while (FALSE !== ($file = readdir($dh))) {
if (($file != '.') && ($file != '..')) {
if (is_dir($source . DIRECTORY_SEPARATOR . $file)) {
CRM_Utils_File::copyDir($source . DIRECTORY_SEPARATOR . $file, $destination . DIRECTORY_SEPARATOR . $file);
}
}
}
- closedir($dir);
+ closedir($dh);
}
}
* @param string $name
* Name of file.
*
- * @return boolean whether the file was recoded properly
+ * @return bool
+ * whether the file was recoded properly
*/
public static function toUtf8($name) {
static $config = NULL;
* @param string $slash
*
* @return string
- * @static
*/
public static function addTrailingSlash($path, $slash = NULL) {
if (!$slash) {
// allow html/htm extension ONLY if the user is admin
// and/or has access CiviMail
if (!(CRM_Core_Permission::check('access CiviMail') ||
- CRM_Core_Permission::check('administer CiviCRM') ||
- (CRM_Mailing_Info::workflowEnabled() &&
- CRM_Core_Permission::check('create mailings')
- )
- )) {
+ CRM_Core_Permission::check('administer CiviCRM') ||
+ (CRM_Mailing_Info::workflowEnabled() &&
+ CRM_Core_Permission::check('create mailings')
+ )
+ )
+ ) {
unset($extensions['html']);
unset($extensions['htm']);
}
}
/**
- * Determine whether a given file is listed in the PHP include path
+ * Determine whether a given file is listed in the PHP include path.
*
* @param string $name
* Name of file.
*
- * @return boolean whether the file can be include()d or require()d
+ * @return bool
+ * whether the file can be include()d or require()d
*/
public static function isIncludable($name) {
$x = @fopen($name, 'r', TRUE);
* @return string
*/
public static function makeFileName($name) {
- $uniqID = md5(uniqid(rand(), TRUE));
- $info = pathinfo($name);
+ $uniqID = md5(uniqid(rand(), TRUE));
+ $info = pathinfo($name);
$basename = substr($info['basename'],
0, -(strlen(CRM_Utils_Array::value('extension', $info)) + (CRM_Utils_Array::value('extension', $info) == '' ? 0 : 1))
);
* @return array
*/
public static function getFilesByExtension($path, $ext) {
- $path = self::addTrailingSlash($path);
+ $path = self::addTrailingSlash($path);
+ $files = array();
if ($dh = opendir($path)) {
- $files = array();
while (FALSE !== ($elem = readdir($dh))) {
if (substr($elem, -(strlen($ext) + 1)) == '.' . $ext) {
$files[] .= $path . $elem;
}
}
closedir($dh);
- return $files;
}
+ return $files;
}
/**
return $_path;
}
+ /**
+ * Determine if a path is absolute.
+ *
+ * @return bool
+ * TRUE if absolute. FALSE if relative.
+ */
+ public static function isAbsolute($path) {
+ if (substr($path, 0, 1) === DIRECTORY_SEPARATOR) {
+ return TRUE;
+ }
+ if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+ if (preg_match('!^[a-zA-Z]:[/\\\\]!', $path)) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
+
/**
* @param $directory
*
}
// check if directory is relative, if so return immediately
- if (substr($directory, 0, 1) != DIRECTORY_SEPARATOR) {
+ if (!self::isAbsolute($directory)) {
return $directory;
}
}
/**
- * Make a file path relative to some base dir
+ * Make a file path relative to some base dir.
*
* @param $directory
* @param $basePath
* @return string
*/
public static function relativize($directory, $basePath) {
+ if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
+ $directory = strtr($directory, '\\', '/');
+ $basePath = strtr($basePath, '\\', '/');
+ }
if (substr($directory, 0, strlen($basePath)) == $basePath) {
return substr($directory, strlen($basePath));
- } else {
+ }
+ else {
return $directory;
}
}
/**
- * Create a path to a temporary file which can endure for multiple requests
+ * Create a path to a temporary file which can endure for multiple requests.
*
* TODO: Automatic file cleanup using, eg, TTL policy
*
- * @param $prefix
- * String.
+ * @param string $prefix
*
* @return string, path to an openable/writable file
* @see tempnam
}
/**
- * Create a path to a temporary directory which can endure for multiple requests
+ * Create a path to a temporary directory which can endure for multiple requests.
*
* TODO: Automatic file cleanup using, eg, TTL policy
*
- * @param $prefix
- * String.
+ * @param string $prefix
*
* @return string, path to an openable/writable directory; ends with '/'
* @see tempnam
*
* Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
*
- * @param $dir
- * String, base dir.
- * @param $pattern
- * String, glob pattern, eg "*.txt".
+ * @param string $dir
+ * base dir.
+ * @param string $pattern
+ * glob pattern, eg "*.txt".
+ * @param bool $relative
+ * TRUE if paths should be made relative to $dir
* @return array(string)
*/
- public static function findFiles($dir, $pattern) {
+ public static function findFiles($dir, $pattern, $relative = FALSE) {
+ $dir = rtrim($dir, '/');
$todos = array($dir);
$result = array();
while (!empty($todos)) {
if (is_array($matches)) {
foreach ($matches as $match) {
if (!is_dir($match)) {
- $result[] = $match;
+ $result[] = $relative ? CRM_Utils_File::relativize($match, "$dir/") : $match;
}
}
}
$path = $subdir . DIRECTORY_SEPARATOR . $entry;
if ($entry{0} == '.') {
// ignore
- } elseif (is_dir($path)) {
+ }
+ elseif (is_dir($path)) {
$todos[] = $path;
}
}
}
if (empty($childParts)) {
return FALSE; // same directory
- } else {
+ }
+ else {
return TRUE;
}
}
* The new location of the directory.
* @param bool $verbose
*
- * @return bool TRUE on success
+ * @return bool
+ * TRUE on success
*/
public static function replaceDir($fromDir, $toDir, $verbose = FALSE) {
if (is_dir($toDir)) {
CRM_Utils_File::copyDir($fromDir, $toDir);
if (!CRM_Utils_File::cleanDir($fromDir, TRUE, FALSE)) {
- CRM_Core_Session::setStatus(ts('Failed to clean temp dir: %1', array(1 => $fromDir)), '', 'alert');
+ CRM_Core_Session::setStatus(ts('Failed to clean temp dir: %1', array(1 => $fromDir)), '', 'alert');
return FALSE;
}
return TRUE;
}
+
}