[php]Directories listen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb dit volgende script
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<? 
$dir = $_SERVER['DOCUMENT_ROOT'] . '/nabestelservice/';
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
   $files[] = $filename;
}

sort($files);
$aantal = count($files);
for($i=0;$i < $aantal;$i++) {
    if(is_dir($files[$i])){
    $dirs = $files[$i];
}
    
}
print_r($dirs);

?>


Ik wil alle directories uitprinten die in een bepaalde directorie staan. Maar hij print alleen "." en ".." uit.

Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?
session_start();

//Basedirectory where user is locked in.
//Empty basedirectory means that the whole harddisk can be browsed.
//It is required to use a trailing slash.
$basedirectory = '/home/www/';

//Fill in a username and password that will be required to list and view files.
$user = "";
$pass = "";

if(!isset($_SESSION['logged_in']))
{
        if($_POST['username'] == $user && $_POST['password'] == $pass)
        {   
            $_SESSION['logged_in'] = true;
            header("Location: index.php");
        }
}
?>

<html>
    <head>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
<body>

<?
if(!isset($_SESSION['logged_in']))
{
    print("
        <div style='width:290px; border: 1px solid black; padding:5px'>
            <form method=post action=index.php>
            <label style='width:120px' for=1>Username</label><input style='width:150px' id=1 type=text name=username><br>
            <label style='width:120px' width=120 for=2>Password</label><input style='width:150px' id=2 type=password name=password><br>
            <input style='float:right; margin-right:9px; font-size:11px' type=submit value='login'>
            </form>
        </div>
        </body>
        </html>
        ");
    exit;   
}

if(!isset($_GET['action']))
    $action = 'list';
else
    $action = $_GET['action'];
    
if(!isset($_GET['dir']))
    $directory = '';
else
    $directory = $_GET['dir'];
    
switch ($action) 
{
    case 'list':
        $dir_to_list = $basedirectory.$directory;

    
        $script_array = explode("/", $dir_to_list);
        if(in_array("..", $script_array))
        {
            print("Don't cheat!");
                exit;
        }
    
        echo '  <center><table>
                <td style="background-color: #DCDCDC; border-bottom: 1px solid black" colspan=2><b>'.$dir_to_list.'</b></td>
                <tr>
                    <td style="border-bottom: 1px solid black" width="350">Name</td>
                    <td style="border-bottom: 1px solid black" width="150">Type</td>
                </tr>';
    
        if ($handle = opendir($dir_to_list)) {
           while (false !== ($file = readdir($handle))) { 
               if ($file != "." && $file != "..") { 
                   if(!is_dir($dir_to_list.$file))
                    $files[] = $file;
                   else
                    $dirs[] = $file;
               } 
           }
           closedir($handle); 
        }
        
        if(is_array($dirs))
        {
            sort($dirs);
            foreach($dirs as $value)
            {
                echo "<tr><td><a href ='index.php?action=list&dir=".$directory.$value."/'><b>".$value."</b></a></td><td>--dir</td></tr>";
            }
        }
        
        if(is_array($files))
        {
            sort($files);
            foreach($files as $value)
            {
                echo "<tr><td><a href ='index.php?action=view&file=".$directory.$value."'>".$value."</a></td><td>--file</td></tr>";
            }
        }
        echo '</table></center>';
    break;
    case 'view':
        $script = $basedirectory.$file;
        $script_array = explode("/", $script);
        
        if(in_array("..", $script_array))
        {
            print("Don't cheat!");
                exit;
        }
        if (!$script) 
        {
                echo "<br /><b>ERROR: Script Name needed</b><br />";
            }       
            else 
            {
                if (ereg("(\\.php|\\.inc|\\.js|\\.tpl|\\.css|\\.xsl|\\.txt|\\.sql)$", $script)) 
                {
                    echo "<h1>Source of: " . $script . "</h1>\n<hr />\n";
                    highlight_file($script);
                } 
                else 
                {
                    echo "<h1>ERROR: Only PHP or include script names are allowed</h1>"; 
                }
        }
        echo "<hr />Processed: " . date("Y/M/d H:i:s", time());
    break;
}
?>
</body>
</html>


Had dit scriptje nog liggen. Trouwens ook voor een groot deel van php.net gehaald. Daar kan je dus ook bijna letterlijke voorbeelden vandaan halen.

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 22:43
Verwijderd schreef op maandag 06 december 2004 @ 20:09:
[..]
Ik wil alle directories uitprinten die in een bepaalde directorie staan. Maar hij print alleen "." en ".." uit.
Ah ja, typisch probleem. Ik heb me hier ook al 'tig keer in vergist in PHP. Je script heeft een werkdirectory, bijvoorbeeld "/home/www". Je bekijkt de directory "/home/www/nabestelservice" en je krijgt dan in je array de namen van de bestanden in die directory, bijvoorbeeld ".", "..", "foo", "bar", "baz".

Als je nu vervolgens die bestanden bekijkt (bijvoorbeeld is_dir("foo")) dan wordt dat bestand gezocht in de werkdirectory, omdat je een relatief pad hebt gegeven! In de werkdirectory bestaan die bestanden helemaal niet, dus krijg je sowieso FALSE terug. De reden dat je wel "." en ".." terugkrijgt, is dat die directories in elke directory aanwezig zijn, dus ook in de huidige werkdirectory.

De oplossing is dus simpel: zet het pad voor die bestandsnamen. In jouw geval moet je op regel 11 dus is_dir($dir . $files[$i]) zetten.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
PHP5 heeft daar een mooie DirectoryIterator voor, met een isDot method. Erg handig :)

http://www.php.net/manual...rectoryiterator-isdot.php

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// getDirs - get all directory's in the sent directory
function getDirs($base)
{

global $dirs; // make $dirs public for the rest of the script

if(is_dir($base)){ // check if basedir exists
         $dh = opendir($base);
    while (false !== ($dir = readdir($dh))) {
            if(is_dir($base . $dir) && $dir !== '.' && $dir !== '..'){
                $directory = "albums/$dir";
                    $year = date("Y", filemtime($directory));
                    $month = date("m", filemtime($directory));
                    $day = date("d", filemtime($directory));
                    $dirs[] = array("dir" => "$dir", "day" => "$day", "month" => "$month", "year" => "$year"); 
            }
            else
            {
                    next;
            }
        }
    closedir($dh);
        }
}

getDirs("/usr/local/www/www.domain.com/");


een scriptje wat ik nog had (komt grotendeels van php.net geloof ik). Heb em iets gestript van wat functies nog. Hij gooit zowel de directory naam in n array als de bijhorende datum dat de dir gemaakt/gewijzigd is. Als je wilt weten hoe je die simpel kunt sorten dan heb ik daar nog een script voor die ik van php.net heb. Met array_reverse() kun je de dirlist simpel omkeren btw, misschien handig.

[ Voor 21% gewijzigd door Cartman! op 07-12-2004 11:21 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Met is_file() kun je toch alle 'bestanden' nagaan? Of denk ik te simpel?
Pagina: 1