【问题标题】:php write subdirectories' contents into separate text filesphp 将子目录的内容写入单独的文本文件
【发布时间】:2012-06-19 06:18:02
【问题描述】:

我正在尝试列出子目录中的文件并将这些列表写入单独的文本文件。

我设法获取目录和子目录列表,甚至将所有文件写入文本文件。

我似乎无法摆脱我正在创建的循环。我要么最终得到一个文本文件,要么第二个以上的文件也包括所有前面的子目录内容。

我需要实现的是:

  • 目录 A/AA/a1.txt,a2.txt >> AA.log
  • 目录 A/BB/b1.txt,b2.txt >> BB.log

希望这是有道理的。

我发现 PHP SPL RecursiveDirectoryIterator RecursiveIteratorIterator retrieving the full tree 中描述的 recursiveDirectoryIterator 方法很有帮助。然后我使用 for 和 foreach 循环遍历目录,写入文本文件,但我不能将它们分成多个文件。

【问题讨论】:

  • 我不明白你的问题到底是什么。我通常会说这样的问题是可以解决的,但是你给出的描述给变量留下了太多的空间,所以我认为你应该改进你的问题。
  • 请提供您遇到问题的源代码。

标签: php


【解决方案1】:

很可能您没有过滤掉目录...

$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);
}

【讨论】:

  • 感谢您到目前为止的回复!我将完成上述工作,无论天气是否解决,我都会带回源代码。我以前没有的唯一原因是因为我尝试了多种方法并且总是以类似的方式失败。我从上面看到的第一件事是我的想法可能不正确,我可能使用了错误的循环类型。很快回来,再次感谢!
【解决方案2】:

我想我会展示一种不同的方式,因为这似乎是使用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));
    });

【讨论】:

  • 大家好,再次表示感谢 - 我应该回来报告(我认为),但这是一个家庭项目,过去一周的工作完全超过了生活,我还没有完成,但尽快回来!再次感谢您的帮助!
猜你喜欢
  • 2014-02-28
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多