我正在尝试列出子目录中的文件,并将这些列表写入单独的文本文件中。
我设法获取目录和子目录列表,甚至将所有文件写入文本文件。
我似乎无法摆脱我正在创造的循环。我要么最终得到一个文本文件,要么第二个+文件也包含所有前面的子目录内容。
我需要做的是:
希望这是有道理的。
我发现PHP SPL RecursiveDirectoryIterator RecursiveIteratorIterator retrieving the full tree中描述的recursiveDirectoryIterator方法很有帮助。然后我使用for和foreach
循环遍历目录,编写文本文件,但我不能将它们分成多个文件。
答案 0 :(得分:2)
您很可能不会过滤掉.
和..
目录。
$maindir=opendir('A');
if (!$maindir) die('Cant open directory A');
while (true) {
$dir=readdir($maindir);
if (!$dir) break;
if ($dir=='.') continue;
if ($dir=='..') continue;
if (!is_dir("A/$dir")) continue;
$subdir=opendir("A/$dir");
if (!$subdir) continue;
$fd=fopen("$dir.log",'wb');
if (!$fd) continue;
while (true) {
$file=readdir($subdir);
if (!$file) break;
if (!is_file($file)) continue;
fwrite($fd,file_get_contents("A/$dir/$file");
}
fclose($fd);
}
答案 1 :(得分:1)
我认为我会展示一种不同的方式,因为这似乎是一个使用glob
的好地方。
// Where to start recursing, no trailing slash
$start_folder = './test';
// Where to output files
$output_folder = $start_folder;
chdir($start_folder);
function glob_each_dir ($start_folder, $callback) {
$search_pattern = $start_folder . DIRECTORY_SEPARATOR . '*';
// Get just the folders in an array
$folders = glob($search_pattern, GLOB_ONLYDIR);
// Get just the files: there isn't an ONLYFILES option yet so just diff the
// entire folder contents against the previous array of folders
$files = array_diff(glob($search_pattern), $folders);
// Apply the callback function to the array of files
$callback($start_folder, $files);
if (!empty($folders)) {
// Call this function for every folder found
foreach ($folders as $folder) {
glob_each_dir($folder, $callback);
}
}
}
glob_each_dir('.', function ($folder_name, Array $filelist) {
// Generate a filename from the folder, changing / or \ into _
$output_filename = $_GLOBALS['output_folder']
. trim(strtr(str_replace(__DIR__, '', realpath($folder_name)), DIRECTORY_SEPARATOR, '_'), '_')
. '.txt';
file_put_contents($output_filename, implode(PHP_EOL, $filelist));
});