Programeer opdrachtenOpdracht : opdr3_knopper.txt

Terug naar de inzendingen
Opdracht 3, Sander Knopper
15-Feb-2005
 Mijn inzending:
 1 
****opdracht3.php*****
  
 2#!/usr/bin/php
 3
 4
 5
 6/****************************************************************
 7* Title: Photo orderer                        *
 8* Author: Sander Knopper             *
 9* License: GPL v2 or later                    *
 10* Required: PHP >= 4.3.0 in CLI mode with libexif enabled    *
 11*                                *
 12* How to use: start the script with the absolute path        *
 13*          containing the photos as parameter.        *
 14****************************************************************/
 15
 16//
 17// Configuratiegedeelte
 18//
 19
 20// Wat moet er voor het nummer van de foto komen te staan?
 21$prefix = "foto";
 22
 23// Wat is het max. aantal foto's?
 24$max_photos = "9999";
 25
 26//
 27// Einde configuratie
 28//
 29
 30if (!isset ($argv[1])) {
 31
 32    echo    "Fout: geef de directory waarin de foto's staan mee als parameter,
 33dit moet een absoluut pad zijn.\n";
 34    exit;
 35}
 36
 37if (!is_dir ($argv[1])) {
 38
 39    echo    "Fout: directory bestaat niet.\n";
 40    exit;
 41}
 42
 43else {   
 44
 45    $path = $argv[1];
 46}
 47
 48if (strlen ($prefix) == 0) {
 49
 50    echo    "Fout: prefix moet uit minimaal 1 karakter bestaan.";
 51    exit;
 52}
 53
 54function check_image ($image) {
 55
 56    $extensions = array (1 => "gif",
 57                2 => "jpg",
 58                3 => "png",
 59                4 => "swf",
 60                5 => "psd",
 61                6 => "bmp",
 62                7 => "tiff",
 63                8 => "tiff",
 64                9 => "jpc",
 65                10 => "jp2",
 66                11 => "jpx",
 67                12 => "jb2",
 68                13 => "swc",
 69                14 => "iff",
 70                15 => "wbmp",
 71                16 => "xbm");
 72
 73    if (!$number = exif_imagetype ($image)) {   
 74
 75        return FALSE;
 76    }
 77
 78    else {
 79
 80        $extension = $extensions[$number];
 81
 82        return $extension;
 83    }
 84
 85}
 86
 87function rename_file ($old) {
 88
 89    global $max_photos, $path, $file, $prefix, $cur_number, $extension;
 90
 91    $num_prefix = "";
 92
 93    // Een loopje om het juist aantal nullen te genereren aan de hand van het
 94    // aantal cijfers van het max. aantal foto's en het fotonummer
 95    // waar het script op dit moment mee bezig is.
 96   
 97    while (strlen ($num_prefix) < (strlen ($max_photos) - strlen
 98($cur_number))) {
 99
 100        $num_prefix = $num_prefix."0";
 101    }
 102
 103    $newname = $prefix.$num_prefix.$cur_number.$extension;
 104
 105    if (!rename ($path."/".$old, $path."/".$newname)) {
 106
 107        return FALSE;
 108    }
 109
 110    else {
 111
 112        return TRUE;
 113    }
 114}
 115
 116$num_files = 1;
 117
 118$dh = opendir ($path);
 119
 120while (($file = readdir ($dh)) !== FALSE) {
 121
 122    if ($file != "." && $file != "..") { // "." en ".." zijn sowieso geen
 123foto's.
 124
 125        $num_files++;
 126    }
 127}
 128
 129if ($num_files > $max_photos) {
 130
 131    echo    "Fout: er zijn meer bestanden in deze directory dan het maximum
 132aantal dat is opgegeven.\n";
 133
 134    exit;
 135}
 136
 137// Opnieuw de directory openen anders denkt php dat er geen bestanden meer
 138// zijn.
 139
 140closedir ($dh);
 141
 142$dh = opendir ($path);
 143
 144$cur_number = 1;
 145
 146while (($file = readdir ($dh)) !== FALSE) {
 147
 148    if ($file != "." && $file != "..") {
 149
 150        if (!$extension = check_image ($path."/".$file)) {
 151
 152            echo    "Fout: ".$file." is geen geldige afbeelding.\n";
 153        }
 154
 155        else {
 156
 157            if (!rename_file ($file)) {
 158
 159                echo    "Fout: kon ".$file." niet hernoemen. Controleer de
 160permissies.\n";
 161            }
 162
 163            else {
 164
 165                echo    $file." is succesvol hernoemd.\n";
 166
 167                $cur_number++;
 168            }
 169        }
 170    }
 171}
 172
 173closedir ($dh);
 174
 175echo    "\n\nEr zijn in totaal ".$cur_number." afbeeldingen hernoemd.\n";
 176
 177?>
 
 
Mijn commentaar
 
 Sander, je begint heel goed.
 Mooi en redelijk overzichtig opgezet en je vertelt redelijk goed wat je doet.
 Ik heb echter toch een paar aanmerkingen.
 Om te beginnen voldoet het script niet aan de opdracht.
 Ik weet niet precies hoe [I]rename[/I] in php gedefinieerd is dat kon ik uit
 de manual niet halen.
 Maar normaal gesproken zal rename oude files overschrijven.
 Dat betekend dus dat je files mogelijk gaat wissen.
 dat zal zeker gebeuren als je het script twee maal achter elkaar draait !
 Waneer [I]rename[/I] niet overschrijft betekend het dat niet alle files
 genummerd zullen worden.
 De truuk zit ehm erin dit probleem te onderkennen en er een oplossing voor te
 vinden.
 ik heb dat in mijn perl versie gedaan door files die ik niet kan hernoemen
 omdat de nieuwe naam al bestaat in een later stadium nog eens te proberen.
 Ik merkte dat de loop soms drie maal doorgelopen werd voordat alle foto's een
 nummer hadden.
 
 Verder stel ik van regel 104 / 112 een onhandigheidje vast.
 je had daar gewoon [B]return rename ($path."/".$old, $path."/".$newname)[/B]
 kunnen schrijven.
 Dat behoeft verder geen betoog.
 
 Ik moet zeggen dat je iha keurig probeert om eventuele problemen af te vangen
 Eentje heb je echter nog over het hoofd gezien.
 op regel 117 en regel 141 open je een filefescriptor voor een directory.
 Je controleert echter niet of dit wel goed gaat.
 Als je voor de betreffende directory geen rechten hebt gaat dit zeker fout !
 
 Afgezien van de beschreven opmerkingen vind ik het een aardig stukje werk.
 De output in regel 158, 164 en 174 maakt het programma toch weer wat fraaier.