以下代码用于遍历图像目录并重命名。
我让它运行良好,但我想添加的是文件开头的'静态'标记,一旦重命名,它将来会被忽略。
例如,假设我们有一个包含100个文件的目录。
前20个名称为“image-JTzkT1RYWnCqd3m1VXYcmfZ2nhMOCCunucvRhuaR5.jpg” 最后的80个名称为“FejVQ881qPO5t92KmItkNYpny.jpg”,这绝对是任何事情。
我想忽略已经重命名的文件(在文件名开头用'image-表示)
我该怎么做?
<?php
function crypto_rand_secure($min, $max) {
$range = $max - $min;
if ($range < 0) return $min; // not so random...
$log = log($range, 2);
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd >= $range);
return $min + $rnd;
}
function getToken($length){
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
for($i=0;$i<$length;$i++){
$token .= $codeAlphabet[crypto_rand_secure(0,strlen($codeAlphabet))];
}
return $token;
}
$dir = "/path/to/images";
if ( $handle = opendir ( $dir)) {
echo "Directory Handle = $handles<br />" ;
echo "Files: <br />" ;
while ( false !== ($file = readdir($handle))) {
if ( $file != "." && $file != ".." ) {
$isdir = is_dir ( $file ) ;
if ( $isdir == "1" ) {} // if its a directory do nothing
else {
$file_array[] = "$file" ; // get all the file names and put them in an array
//echo "$file<br />" ;
} // closes else
} // closes directory check
} // closes while
} // closes opendir
//Lets go through the array
$arr_count = count( $file_array ) ; // find out how many files we have found so we can initiliase the counter
for ( $counter=1; $counter<$arr_count; $counter++ ) {
echo "Array = $file_array[$counter] - " ; // tell me how many files there are
//$new = str_replace ( "C", "CIMG", $file_array[$counter] ) ; // now create the new file name
$new =getToken(50);
//if (substr($file_array[$counter]), 0, 3) == "gallery_image")
//{
//}
//else
//{
$ren = rename ( "$dir/$file_array[$counter]" , "image-$dir/$new.jpg" ) ; // now do the actual file rename
echo "$new<br />" ; // print out the new file name
//}
}
closedir ( $handle ) ;
?>
答案 0 :(得分:1)
对于应该非常微不足道的事情,你似乎正在做很多不必要的工作。
据我了解,您希望从目录中获取文件列表,并重命名所有尚未预先加载image-
的文件。
您可以使用以下代码执行此操作:
$dir = "/path/to/dir/"; //Trailing slash is necessary or you would have to change $dir.$newname to $dir.'/'.$newname further down the code
if(is_dir($dir)){
$dirHandle = opendir($dir);
while($file = readdir($dirHandle)){
if(is_file($dir.$file) === TRUE){
if(strpos($file, 'image-') === 0)
continue; //Skip if the image- is apready prepended
while(TRUE){
$cryptname = md5(mt_rand(1,10000).$file.mt_rand(1,10000)); //Create random string
$newname = 'image-'.$cryptname.'.jpg'; //Compile new file name
if(is_file($dir.$newname) === FALSE) //Check file name doesn't exist
break; //Exit loop if it doesn't
}
rename($dir.$file, $dir.$newname); //Rename file with new name
}
}
}
如果您想使用自己的功能,则可以更改以下行:
$cryptname = md5(mt_rand(1,10000).$file.mt_rand(1,10000));
使用您的功能代替md5
。像:
$cryptname = getToken(50);
我建议您还应该检查文件名是否已经存在,否则可能 - 您可能会有覆盖文件的风险。
/images/
vs ./images/
首先,在处理网络时,您必须了解实际上有两个root
目录。
Web根目录和文档根目录。以示例网址http://www.mysite.com/images/myimage.jpg
为例,就 web root 而言,路径名称为/images/myimage.jpg
但是,从php
您可以使用文档root 实际上是这样的:/home/mysite/pubic_html/images/myimage.jpg
因此,当您在php中键入/
时,它认为您指的是home
所在的目录。
./images/
有效,因为./
表示此目录,即脚本/ php所在的目录。
在您的情况下,您可能具有以下文件结构:
>/
>home
>public_html
>images
image-243.jpg
image-243.jpg
index.php
因为index.php
与images
位于同一文件夹中:./images/
等于/home/public_html/images/
。另一方面,/
表示home
的父目录,其中没有图片文件夹,更不用说您要定位的目录。
如果你更习惯于把它想象成这样:在php /
中意味着文档根目录(在类似C:\
的窗口上)。
答案 1 :(得分:0)
您的文件名目录部分前面有'image-':
$ren = rename ( "$dir/$file_array[$counter]" , "image-$dir/$new.jpg" )
应该是
$ren = rename ( "$dir/$file_array[$counter]" , "$dir/image-$new.jpg" )