php做的一道面试题,读取目录下的文件(以及心得)
首先题目大致如下:获取选择的文件目录下的所有文件:按回车键进入下一个文件(语言不限);
无奈,想破脑袋我还只只想到了 fopen 和file_get_contents(只是打开文件,读取文件)
回来后反思(其实是不甘心)查找到scandir()和opendir();
然后scandir()如下:
(1)首先我们假定路径
const getURL="D:/WoodenWang/Documents";
(2)接着直接使用函数,对就是这么简单
$list=scandir(getURL); //获取目录下的所有文件,接着你就可以试着打印一下这个结果
var_dump($list);//返回一个数组,当然还有"."和"..";此时我们过滤掉
$newList=[];// 先提前准备一个容器接受;然后过滤
for($i=0;$i<count($list);$i++){
if($list[$i]!="."&&$list[$i]!=".."){
array_push($newList,$list[$i]);
}
}
var_dump($newList);//打印一下,获取数组然后我们就可以在这里读取文件了啊!!!
for($i=0;$i<count($newList);$i++){
echo file_get_contents(getURL."/".$newList[$i])."<hr />";
}
ojbk,但是并不符合题意 啊,怎么办?
好吧,那我们写一个表单,写完表单刷新页面发现中文乱码,无奈的我在有忘掉了header()里的参数(建议大家不要过于依赖框架的开发,有空再多多的回顾一下基础知识)
为了惩罚自己,我选择手敲100遍 header("content-type:text/html; charset=utf8");(傲娇的我怎么能这样惩罚自己啦。当然循环100次啊)
好吧,就先这样吧还要在研究一下opendir(),在增加点击事件模拟下一页然后用file_fet_contents()获取数据就可以了。
详细代码看附件,不不不,直接粘出来吧:
<?php
header("content-type:text/html; charset=utf8");
if(empty($_POST)){
header("location:index.html");
}
if(!is_dir($_POST["sendUrl"])){
header("location:index.html");
}
$getUrl=$_POST["sendUrl"];
echo $getUrl;
//exit();
// $getUrl="D:/WoodenWang/Documents";
$list=scandir($getUrl); //获取目录下的所有文件
echo "<br />";
$newList=[];
for($i=0;$i<count($list);$i++){
if($list[$i]!="."&&$list[$i]!=".."){
array_push($newList,$list[$i]);
}
}
echo "<br />";
// var_dump($newList);
echo "<br />";
for($i=0;$i<count($newList);$i++){
echo $newList[$i]."<hr />";
// echo file_get_contents($getUrl."/".$newList[$i])."<hr />";//获取内容
}
?>
还有啊, 我只是对传到后台的数据只是简单的判断,在实际开发中一定要详细的判断,过滤和检测,安全决定存亡!!!!
编程太难了,膜拜大佬,告辞
楼主还有其他面试题么 可否分享 function tree(&$arr_file, $directory, $dir_name=''){
$mydir = dir($directory);
while($file = $mydir->read())
{
if((is_dir("$directory\\$file")) AND ($file != ".") AND ($file != ".."))
{
tree($arr_file, "$directory\\$file", "$dir_name\\$file");
}
else if(($file != ".") AND ($file != ".."))
{
//只读取目录
$arr_file[] = "$dir_name\\" . "\r\n";
//读取目录和文件
// $arr_file[] = "$dir_name\\$file" . "\r\n";
}
}
$mydir->close();
}
$arr_file = array();
tree($arr_file, "./ch/");
$newa2 = array_unique($arr_file);
$newa2 = array_merge($newa2);
file_put_contents('asd.txt', $newa2); /*
*new getFile($_dir[,$_emptyDir,$_fileType]);
* @parma $_dir 是目录名称
* @parma $_emptyDir 是否获取空文件夹,选填,默认不获取,true则获取空文件夹
* @parma $_fileType 获取文件名称的类型,选填,默认获取只文件名称,true则获取带有路径的文件名称
**/
class getFiles {
private $_dir;
private $_emptyDir;
private $_fileType;
public $_files;
public function __construct($_dir,$_emptyDir = false,$_fileType = true) {
$this->_dir = $_dir;
$this->_emptyDir = $_emptyDir;
$this->_fileType = $_fileType;
if ($this->_emptyDir) {
$this->getFileEmpty($this->_dir,$this->_files);
} else {
$this->getFile($this->_dir,$this->_files);
}
}
//读取文件夹所有文件不包括空文件夹
private function getFile($_dir,&$_arr) {
if (!!$_dirs = opendir($_dir)) {
while (($_file=readdir($_dirs)) != false) {
if ($_file == '.' || $_file == '..') continue;
$_files = $_dir .'/'. $_file;
if (is_dir($_files)) {
$this->getFile($_files,$_arr);
} else {
if ($this->_fileType) {
$_arr[] = $_files;
} else {
$_arr[] = $_file;
}
}
}
}
closedir($_dirs);
}
//读取文件夹所有文件包括空文件夹
private function getFileEmpty($_dir,&$_arr) {
if (!!$_dirs = opendir($_dir)) {
while (($_file=readdir($_dirs)) != false) {
if ($_file == '.' || $_file == '..') continue;
$_files = $_dir .'/'. $_file;
if (is_dir($_files) && $this->isEmpty($_files)) {
$this->getFileEmpty($_files,$_arr);
} else {
if ($this->_fileType) {
$_arr[] = $_files;
} else {
$_arr[] = $_file;
}
}
}
}
closedir($_dirs);
}
//判断文件夹是否为空
private function isEmpty($_dir) {
if (!!$_dirs = opendir($_dir)) {
while (($_file=readdir($_dirs)) != false) {
if($_file != '.' && $_file != '..') {
closedir($_dirs);
return true;
break;
}
}
closedir($_dirs);
return false;
}
}
} 平时开发不会都百度,,,,,,,,,,嘻嘻
页:
[1]