Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: объеденить все файлы в один
 
 автор: kriemm   (15.07.2009 в 21:28)   письмо автору
 
 

Всем привет! Столкнулся с задачей - в деректории лежит куча папок, в них текстовые файлы. Необходимо пройти все папки с названием "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_idimplode("\x0d\x0a"$total_lines));

 
fclose($output_file_id);
}

?>

  Ответить  
 
 автор: Николай2357   (15.07.2009 в 23:13)   письмо автору
 
   для: kriemm   (15.07.2009 в 21:28)
 

Нужно как минимум оформить это функцией и вызвать рекурсию, если встретится директория.

  Ответить  
 
 автор: kriemm   (16.07.2009 в 20:26)   письмо автору
 
   для: Николай2357   (15.07.2009 в 23:13)
 

алгоритм понятен, но воплотить пока не получается... ладно буду пробовать.

  Ответить  
 
 автор: kriemm   (18.07.2009 в 17:23)   письмо автору
 
   для: 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);

?>

  Ответить  
 
 автор: Trianon   (18.07.2009 в 18:29)   письмо автору
 
   для: kriemm   (18.07.2009 в 17:23)
 

Очевидно, Вы пытаетесь с каталогом работать, как будто он - обычный файл. Система протестует.


PS. Можно поинтересоваться, зачем понадобилось бы склеивать в одо месиво все файлы, включая php-шные?
И убирая при этом пробелы из строк.

  Ответить  
 
 автор: kriemm   (19.07.2009 в 01:03)   письмо автору
 
   для: Trianon   (18.07.2009 в 18:29)
 

Хм, пробелы из строк не удаляются. А в папках лежат только текстовые файлы с контентом. А как сделать что бы папки не обрабатывались как файлы?

  Ответить  
 
 автор: Trianon   (19.07.2009 в 01:17)   письмо автору
 
   для: kriemm   (19.07.2009 в 01:03)
 

if(!is_dir($file))
нет?

  Ответить  
 
 автор: kriemm   (19.07.2009 в 22:14)   письмо автору
 
   для: 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]);
 }



?>

  Ответить  
 
 автор: Trianon   (19.07.2009 в 22:22)   письмо автору
 
   для: kriemm   (19.07.2009 в 22:14)
 

$file != is_dir($file) - чушь.
is_dir возвращает логическое значение сама по себе

  Ответить  
 
 автор: kriemm   (19.07.2009 в 22:51)   письмо автору
 
   для: Trianon   (19.07.2009 в 22:22)
 

>$file != is_dir($file) - чушь.
>is_dir возвращает логическое значение сама по себе

Спасибо, а все таки почему цикл выполняется только один раз?

  Ответить  
 
 автор: Trianon   (19.07.2009 в 23:07)   письмо автору
 
   для: kriemm   (19.07.2009 в 22:51)
 

Сомневаюсь в этом.
Цикл работает, пока исполняется условие в заголовке цикла.
Условие задано вполне конкретно.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования