Php获取目录中文件的基名

时间:2013-07-05 08:30:48

标签: php

我想创建指向特定目录中所有文件的链接。实施例

Directory: /account contains;

user/
data/
register.txt
login.txt
instructions.docx

我想有php生成:

<a href="action.php?action=register.txt">register</a>
<a href="action.php?action=login.txt">login</a>

最好只创建.txt文件的链接。

我有这段代码:

<?php
 if ($handle = opendir('account')) {
 while (false !== ($file = readdir($handle)))
 {
    if (($file != ".") 
     && ($file != ".."))
    {
        $test=`basename "$file"`; //this is line 8
        $thelist = '<a href="action.php?action='.$file.'">'.$test.'</a>';
    }
   }



   closedir($handle);
  } 
  ?>

 <P>List of files:</p>
 <UL>
 <P><?=$thelist?></p>
 </UL>

但它给出了这个错误:

 Warning: shell_exec() has been disabled for security reasons in /public_html/directory/checkit.php on line 8 

即使它可以工作,它也会显示甚至没有.txt扩展名的文件。 (我知道安全原因错误可以通过更改一些PHP设置或更改一些权限来经常解决?但我知道有一种方法可以在不更改我的所有设置的情况下执行此操作)。

4 个答案:

答案 0 :(得分:4)

替换

$test=`basename "$file"`; //this is line 8

通过

$test=basename("$file");

阅读文档basename()

答案 1 :(得分:1)

您可以使用scandir()获取文件夹的内容:

$theList = '';
$content = scandir('account');
foreach($content as $aFileInIt) {
    // skip files that do not end on ".txt"
    if(!preg_match('/(\.txt)$/i', $aFileInIt))
         continue;
    // save a-elements to variable
    // UPDATE: take the file's basename as the linktext
    $theList .= '<li><a href="action.php?action='.$aFileInIt.'">'.str_ireplace('.txt', '', $aFileInIt).'</a></li>';
}

之后,为了拥有正确的UL元素:

echo '<ul>'.$theList.'</ul>';

答案 2 :(得分:0)

使用GlobIterator代替......

$fs = new GlobIterator(__DIR__.'/*.txt');
foreach ($fs as $file) {
    printf("<a href=\"action.php?action=%s\">%s</a> <br />\n", 
           urlencode($file),
           $file->getBasename(".txt"));
}

注意将完整文件路径传递给action=会产生很多安全隐患,我认为这是一个糟糕的设计并不是一个好主意。

只需传递file namesecurity token而不是

答案 3 :(得分:0)

使用glob功能。

$directory = 'PATH_TO_YOUR_DIRECTORY' . DIRECTORY_SEPARATOR;

foreach( glob( $directory . "*.txt" ) as $filename ) {
  if( ! is_dir( $filename ) ) {
    echo basename( $filename ) . "\n";
  }
}