|
|
|
| Всем привет! Столкнулся с задачей - в деректории лежит куча папок, в них текстовые файлы. Необходимо пройти все папки с названием "content" и объеденить все находящиеся там файлы в один "1.txt" после этого удалить отработанные файлы, то есть в каждой папке "content" должен остаться только один файл - "1.txt" уровень вложения папок может быть разным.
нарыл код, все работает но с одной папкой,а переделать под мои нужды мозгов не хватает:)
<?php
define('RESULT_FILE_PATH', '1.txt');
define('TARGET_DIRECTORY_PATH', '.');
$target_files = array();
$total_lines = array();
if (is_dir(TARGET_DIRECTORY_PATH)) {
if ($dh = opendir(TARGET_DIRECTORY_PATH)) {
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != ".." && $file != basename(__FILE__))
$target_files[] = $file;
}
closedir($dh);
}
$output_file_id = fopen(RESULT_FILE_PATH, 'w') or die('Error: could not open result file!');
chdir(TARGET_DIRECTORY_PATH);
foreach($target_files as $target_file) {
$input_file_id = fopen($target_file, 'rb') or die("Error: could not open input file {$target_file}!");
while (!feof($input_file_id)) {
$line = fgets($input_file_id);
$line = trim($line);
if ($line != '')
$total_lines[] = $line;
}
fclose($input_file_id);
}
natsort($total_lines);
fputs($output_file_id, implode("\x0d\x0a", $total_lines));
fclose($output_file_id);
}
?>
|
| |
|
|
|
|
|
|
|
для: kriemm
(15.07.2009 в 21:28)
| | Нужно как минимум оформить это функцией и вызвать рекурсию, если встретится директория. | |
|
|
|
|
|
|
|
для: Николай2357
(15.07.2009 в 23:13)
| | алгоритм понятен, но воплотить пока не получается... ладно буду пробовать. | |
|
|
|
|
|
|
|
для: kriemm
(16.07.2009 в 20:26)
| | Переделал код под себя, вроде работает - склеивает все файлы в один, и удаляет затем отработанные файлы. но, столкнулся еще с одной проблемой, если в каталоге находится подкаталог то скрипт вываливается с ошибкой. Кто нить может глянуть, что не так?
<?php
// функция склеивает и удаляет лишние файлы
function skleika()
{
define('RESULT_FILE_PATH', 'result.txt');
define('TARGET_DIRECTORY_PATH', '.');
$target_files = array();
if (is_dir(TARGET_DIRECTORY_PATH)) {
if ($dh = opendir(TARGET_DIRECTORY_PATH)) {
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != ".." && $file != basename(__FILE__))
$target_files[] = $file;
}
closedir($dh);
}
$output_file_id = fopen(RESULT_FILE_PATH, 'w') or die('Error: could not open result file!');
chdir(TARGET_DIRECTORY_PATH);
foreach($target_files as $target_file) {
$input_file_id = fopen($target_file, 'rb') or die("Error: could not open input file {$target_file}!");
while (!feof($input_file_id)) {
$line = fgets($input_file_id);
$line = trim($line);
if ($line != '')
fputs($output_file_id, $line . "\x0d\x0a");
}
fclose($input_file_id);
}
fclose($output_file_id);
}
$ABS_DIR = (TARGET_DIRECTORY_PATH);
$d = opendir(TARGET_DIRECTORY_PATH);
while ($n = @readdir($d))
{
if ($n == '.' || $n == '..' || $n == '1.php' || $n == 'result.txt') continue;
if (is_dir($ABS_DIR.'/'.$n))
{
del($ABS_DIR.'/'.$n);
} else {
if (unlink($ABS_DIR.'/'.$n));
else
echo 'Error: could not open input file:'.($ABS_DIR.'/'.$n).'<br>';
}
}
closedir($d);
}
$papka = ".";
skleika($papka);
?>
|
| |
|
|
|
|
|
|
|
для: kriemm
(18.07.2009 в 17:23)
| | Очевидно, Вы пытаетесь с каталогом работать, как будто он - обычный файл. Система протестует.
PS. Можно поинтересоваться, зачем понадобилось бы склеивать в одо месиво все файлы, включая php-шные?
И убирая при этом пробелы из строк. | |
|
|
|
|
|
|
|
для: Trianon
(18.07.2009 в 18:29)
| | Хм, пробелы из строк не удаляются. А в папках лежат только текстовые файлы с контентом. А как сделать что бы папки не обрабатывались как файлы? | |
|
|
|
|
|
|
|
для: kriemm
(19.07.2009 в 01:03)
| | if(!is_dir($file))
нет? | |
|
|
|
|
|
|
|
для: Trianon
(19.07.2009 в 01:17)
| | подскажите где ошибка, цикл исполняет из массива только первый адрес, а потом зацикливается...
<?php
function skleika($papka)
{
define('TARGET_DIRECTORY_PATH', $papka);
define('RESULT_FILE_PATH', $papka.'result.txt');
$target_files = array();
if (is_dir(TARGET_DIRECTORY_PATH)) {
if ($dh = opendir(TARGET_DIRECTORY_PATH)) {
while (($file = readdir($dh)) !== false) {
if ($file != "." && $file != ".." && $file != "result.txt" && $file != is_dir($file) && $file != basename(__FILE__))
$target_files[] = $file;
}
closedir($dh);
}
$output_file_id = fopen(RESULT_FILE_PATH, 'w') or die('Error: could not open result file!');
chdir(TARGET_DIRECTORY_PATH);
foreach($target_files as $target_file) {
$input_file_id = fopen($target_file, 'rb') or die("Error: could not open input file {$target_file}!");
while (!feof($input_file_id)) {
$line = fgets($input_file_id);
$line = trim($line);
if ($line != '')
fputs($output_file_id, $line . "\x0d\x0a");
}
fclose($input_file_id);
}
fclose($output_file_id);
}
}
$pap = array('rab/merge/NeuerOrdner/','rab/merge/Neuer/','rab/merge/Neuer2/');
$count = count( $pap );
if ( count( $pap ) )
for ( $i = 0; $i < $pap; $i ++ ) {
skleika($papp[$i]);
}
?>
|
| |
|
|
|
|
|
|
|
для: kriemm
(19.07.2009 в 22:14)
| | $file != is_dir($file) - чушь.
is_dir возвращает логическое значение сама по себе | |
|
|
|
|
|
|
|
для: Trianon
(19.07.2009 в 22:22)
| | >$file != is_dir($file) - чушь.
>is_dir возвращает логическое значение сама по себе
Спасибо, а все таки почему цикл выполняется только один раз? | |
|
|
|
|
|
|
|
для: kriemm
(19.07.2009 в 22:51)
| | Сомневаюсь в этом.
Цикл работает, пока исполняется условие в заголовке цикла.
Условие задано вполне конкретно. | |
|
|
|