Page 1 of 1
Mass file renamer... Tricky, Please help :-(
Posted: Thu May 27, 2004 7:11 pm
by Chris Corbyn
Hi,
I'm trying to write this program which will copy some files in all subdirectories of a folder.
The file will copied if:
1. It has the extension .jpg
2. It is the only jpg in the folder
The idea is that if any
single jpg in a subdirectory exists it will be copied to the same subdirectory on renamed to Front.jpg
The parent directory is "My Albums", my code so far creates an array of all the directories (and files if there were any) in that folder.
It then uses a foreach loop to open each directory and look for jpg's. My problem is counting the number of jpg's in each subfolder to determine if it's the only one.
Here's my code so far:
Code: Select all
<?php
function buildmp3() {
$dirarray = array();
$handle = opendir ('c:\My Albums');
while ($folder = readdir($handle)) { /*Get contents of directory*/
$dirarray[$folder] = $folder;
}
return $dirarray;
}
$dirarray = buildmp3(); /*Create the array of folder contents from the function above*/
foreach ($dirarray as $n => $v) {
if ($n !="." && $n != "..") { /*Ignore .. and . directories*/
$handle2 = opendir ('c:\my albums\''.$n.''); /*Open subfolders*/
while ($contents = readdir ($handle2)) {
if (substr($contents, -3) == "jpg") {
/*I can't work out where to go from here*/
}
}
}
}
?>
Any ideas or am I going down the wrong path here?
Thanks

Posted: Thu May 27, 2004 7:33 pm
by Chris Corbyn
It basically needs to:
1. Open the "C:\My Albums" folder
2. Get a list of the contents
3. Open each subfolder
4. Get a list of each subfolder's contents
5. Count the number of jpg's present in each subfolder
6. If there is only 1 jpg in the subfolder, copy it to that same folder as Front.jpg
Sounds easy right?
Posted: Fri May 28, 2004 4:26 am
by Chris Corbyn
I tried doing this... I've added into the foreach loop some code to build another array of all the jpegs in each directory and then print_r what it's got inside it.
The output seems a bit random to me, the arrays it creates don't only contain the jpegs for the specific subfolder but also some jpegs for other subfolders???? I'm getting really confused here. I set out on this task thinking it would be a ten minute job and I'm still here the next day trying to work it out lol
Code: Select all
<?php
function buildmp3() {
$dirarray = array();
$handle = opendir ('c:\My Albums');
while ($folder = readdir($handle)) { /*Get contents of directory*/
$dirarray[$folder] = $folder;
}
return $dirarray;
}
$dirarray = buildmp3(); /*Create the array of folder contents from the function above*/
foreach ($dirarray as $n => $v) {
if ($n !="." && $n != "..") { /*Ignore .. and . directories*/
$handle2 = opendir ('c:\\My Albums\''.$n.''); /*Open subfolders*/
while($content = readdir($handle2)) {
if (substr($content, -3) == "jpg") {
$jpgarray[] = $content;
}
print_r($jpgarray);
echo '<p>';
if (array_count_values($jpgarray) == 1) {
echo "yes<br>";
} else {
echo "no<br>";
}
}
}
}
?>
Posted: Fri May 28, 2004 4:58 am
by patrikG
To get directory contents, I am using
Code: Select all
<?php
function get_directory_contents($path){
$mydirectory = opendir($path);
while($entryname=readdir($mydirectory)){
switch (true){
case ($entryname==".") : break;
case ($entryname=="..") : break;
case (is_dir($path."/".$entryname)) : $return["dir"][]=$entryname; break;
default : $return["file"][]=$entryname;
}
}
closedir($mydirectory);
return $return;
}
echo "<h3>directory contents</h3><pre>";
print_r(get_directory_contents("./"));
echo"</pre>";
?>
You get an array back containing the directory structure (incl. subdirectories and their contents) as well as files. Should be easy to filter out the files ending with .jpg with strstr.
Posted: Fri May 28, 2004 5:02 am
by Grim...
Your second code is on the right track, try emptying the array before each subfolder.
Also, the line
Code: Select all
if (substr($contents, -3) == "jpg") {
should read
Code: Select all
if (strtolower(substr($contents, -3) == "jpg")) {
Posted: Fri May 28, 2004 5:27 am
by Chris Corbyn
How do you empty an array? Is it unset($arrayname)? Thanks
Posted: Fri May 28, 2004 5:29 am
by patrikG
yup
Posted: Fri May 28, 2004 5:10 pm
by Chris Corbyn
Thanks guys... I got it working in the end. (Sorry patrikG) just kinda used your function totally unmodified for some of it

lol
Here's what i did in the end....
Code: Select all
<?php
function get_directory_contents($path){
$mydirectory = opendir($path);
while($entryname=readdir($mydirectory)){
switch (true){
case ($entryname==".") : break;
case ($entryname=="..") : break;
case (is_dir($path."".$entryname)) : $return["dir"][]=$entryname; break;
default : $return["file"][]=$entryname;
}
}
closedir($mydirectory);
return $return;
}
function getjpegs($location) {
$jpegs = array();
if (substr($location, -3) != ".db" && substr($location, -3) != "ini") {
$foldercontents = get_directory_contents("C:\My Albums".$location."");
foreach ($foldercontents['file'] as $s => $t) {
if (substr($t, -3) == "jpg") {
$jpegs[] = $t;
}
}
}
return $jpegs;
}
function buildmp3() {
$dirarray = array();
$handle = opendir ('c:\My Albums');
while ($folder = readdir($handle)) { /*Get contents of directory*/
$dirarray[$folder] = $folder;
}
return $dirarray;
}
$dirarray = buildmp3(); /*Create the array of folder contents from the function above*/
foreach ($dirarray as $key => $value) {
$jpegs = getjpegs($value);
echo '<pre>';
print_r($jpegs);
echo '</pre>';
if (count($jpegs) == 1 && $jpegs[0] != "Front.jpg") {
copy ('C:\\My Albums\''.$value.'\''.$jpegs[0].'', 'C:\\My Albums\''.$value.'\Front.jpg');
echo 'File was copied for '.$value.'';
} else {
echo $value.' Not edited';
}
echo '<p>';
}
?>
It's very scrappy I know but I'm not too fussed when it's just for personal use.
Thanks everyone!