我正在编写一个小的PHP脚本来检查文件,如果磁盘的给定路径上存在相同的文件,
目前,脚本从文本文件(file.txt)中读取文件名,然后检查给定路径中的文件,如果文件存在与否,则会在搜索结果数组中推送键/值对。 但问题是,它只显示file.txt中的最后一个文件的成功,即使所有文件都存在,即使我为所有文件提供相同的文件名。
(虽然我可以用其他东西完成它,比如Batch / Shell,power-shell,但只是为了锐化在Php中做的)。无法理解我错过的地方我在从file.txt读取文件名时做错了。
提前感谢任何帮助和感谢。 --Sambhav
- File.txt格式
file1
file2
file3
- PHP脚本
<?php
if (ini_get('display_errors') != 1){ ini_set('display_errors',1); }
$filenames = file('file.txt');
$path = "D:\testpath";
$search_result = array();
foreach ($filenames as $filename)
{
if(file_exists($path.chr(92).$filename))
{
$search_result[$filename] = "File Exists";
}
else
{
$search_result[$filename] = "File not found";
}
}
print_r($search_result);
答案 0 :(得分:2)
$path
未传递给checkfile
试
array_walk($filenames,function($filename) use ($path) {
return checkfile($filename, $path);
});
但问题是,它只显示file.txt中的最后一个文件的成功,即使所有文件都存在,即使我为所有文件提供相同的文件名。
$search_result[$filename]
是一个由filename索引的关联数组,这意味着每个唯一$filename
将包含1个值。如果您提供重复的$filenames
,则只会覆盖现有值。
如果你想记录每一张支票,即使是重复的文件名,也不要使用关联数组:
foreach ($filenames as $filename)
{
if(file_exists($path.chr(92).$filename))
{
$search_result[] = "$filename Exists";
}
else
{
$search_result[] = "$filename not found";
}
}
答案 1 :(得分:0)
使用in built php function.file_exists();
ref http://www.php.net/manual/en/function.file-exists.php
在Windows上,使用// computername / share / filename
如果PHP启用了safe_mode,这将不起作用。尝试设置safe_mode_include_dir以添加异常,并使用语法\ computername \ share \ filename
答案 2 :(得分:0)
好的,因为我怀疑它是从file.txt读取文件名的问题。 在添加可选参数FILE_IGNORE_NEW_LINES时解决了问题。
file('file.txt',FILE_IGNORE_NEW_LINES);
所以这里是工作代码,如果有人正在寻找在给定路径中搜索文件,当然如果有人想要使用数据库存储文件名而不是纯文本文件进行输入或其他一些修改,它可以被修改,具体取决于需求。这只是一个基本脚本,它从file.txt中读取文件名,并在$ path变量中提供的给定目录中搜索它。
PHP脚本
<?php
if (ini_get('display_errors') != 1){ ini_set('display_errors',1); }
$filenames = file('file.txt', FILE_IGNORE_NEW_LINES);
$path = "D:\testfolder";
$search_result = array();
foreach ($filenames as $filename)
{
if(file_exists($path.chr(92).$filename))
{
$search_result[$filename] = "File Exists";
echo $path.chr(92).$filename."<BR />";
}
else
{
$search_result[$filename] = "File not found";
echo $path.chr(92).$filename."<BR />";
}
}
print_r($search_result);
file.txt的格式
file1
file2
file3
答案 3 :(得分:0)
嗯文件名上没有扩展名?除非我错过了什么,他们只是占位符(也许最后一个是文件夹?大声笑)。
<?php
ini_set('display_errors',1); //no need to check just turn it on
$f = fopen('file.txt', 'r'); //use a file stream
$path = "D:/testpath/"; //forward slash works windows and linux
$search_result = array();
while(false !== ( $filename = fgets($f))) //process 1 line at a time how big will file get?
{
$filename = trim($filename); //always remove whitespace
if(file_exists($path.$filename) && is_file($path.$filename))
//file_exists returns true on directories
{
$search_result[$filename] = "File Exists";
}
else
{
$search_result[$filename] = "File not found";
}
}
print_r($search_result);
fclose($f);
-note-代码没有经过测试,但这就是我要做的。
答案 4 :(得分:0)
这是另一个正确的脚本(虽然我在之前的答案中发布的脚本也在运行,但这只是改进)。在这里我添加了Trim来修剪数组值中的空白,并添加了&amp;&amp; is_file($ path.chr(92).trim($ filename))[由@ArtisiticPhoenix建议]检查文件名是否不是目录
<?php
if (ini_get('display_errors') != 1){ ini_set('display_errors',1); }
$filenames = file('file.txt');
$path = "D:\Ebooks\php";
$search_result = array();
foreach ($filenames as $filename)
{
if(file_exists($path.chr(92).trim($filename)) && is_file($path.chr(92).trim($filename)))
{
$search_result[$filename] = "File Exists";
echo $path.chr(92).$filename."<BR />";
}
else
{
$search_result[$filename] = "File not found";
echo $path.chr(92).$filename."<BR />";
}
}
print_r($search_result);