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

Форум PHP

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

 

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

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

тема: Проверка и создание каталога
 
 автор: TetRiska   (12.04.2011 в 02:03)   письмо автору
 
 

function file_copy($file='', $file_name='', $folder=''){
    if($file != '' && $file_name != '' && $folder != ''){
        if(file_exists($folder) == false){
            if(is_dir($folder) == true){
                mkdir($folder, 0777);
                chmod ($folder, 0777);
            }else{
                exit();
            }
        }
        copy($file,$folder.$file_name);
        return $folder.$file_name;
    }
}

file_copy($image, 'list_'.$fname[3],$_SERVER['DOCUMENT_ROOT'].'/files/companies/actions4/');

actions4 не существует, по идее должно создать 1 раз и все, но не создается, думаю из-за ф-ции is_dir. Почему?

  Ответить  
 
 автор: cheops   (12.04.2011 в 07:33)   письмо автору
 
   для: TetRiska   (12.04.2011 в 02:03)
 

is_dir и is_file вернут true, только в том случае если директория и файл существуют - это условие нужно убрать.

PS Кстати, $folder у вас имеет довольно сложную структуру - лучше на всякий случай добавить третий параметр true функции mkdir(), так как по умолчанию она создает только одну директорию - все остальные до этого должны существовать.

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 13:49)   письмо автору
 
   для: cheops   (12.04.2011 в 07:33)
 

Что скажете в этот раз? Все ли учел и верно ли проверки поставил?
function file_copy($file='', $file_name='', $folder='', $resizer=false, $width=null, $height=null, $quality=null){
    if($file != '' && $file_name != '' && $folder != ''){
        //если в пути указан не файл - заканчиваем работу
        if(!is_file($file)){
            exit();
        }
        //если нету каталога, который указан в пути - создаем
        if(!file_exists($folder)){
            //создаем каталог, по умолчанию с правами 0777
            mkdir($folder);
            //проверяем каталог ли это, если нет - заканчиваем работу
            if(!is_dir($folder)){
                exit();
            }
        }
        //если при попытке копирования возникла ошибка - заканчиваем работу
        if(!copy($file,$folder.$file_name)){
            exit();
        }
        if($resizer == true){
            create_thumbnail($image, $file, $width, $height, $quality);
        }
        return $folder.$file_name;
    }
}

  Ответить  
 
 автор: cheops   (12.04.2011 в 14:07)   письмо автору
 
   для: TetRiska   (12.04.2011 в 13:49)
 

Вроде все верно, а у вас копирование нормально происходит?

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 19:20)   письмо автору
 
   для: cheops   (12.04.2011 в 14:07)
 

немного переписал, ибо много лишнего
function file_copy($file='', $file_name='', $folder=''){
   if($file != '' && is_file($fullpath) == true && $file_name != '' && $folder != ''){
      if(is_dir($folder))return true;
      $arr = explode('/', $folder);
      $prev = null;
      for($i=0;$i<count($arr);$i++){
          if(!is_dir($prev . $arr[$i] . '/')){
               mkdir($prev . $arr[$i] . '/', 0777);                  
          }
          $prev .= $arr[$i] . '/';
      }
      if(copy($file,$folder.$file_name)) return $folder.$file_name;
   }
}

- проверка всех переменных на заполнение
- проверка существования файла, что копируем
- проверка директории куда копируем на существование, если есть, просто идем дальше, если нету - проверяем всю цепочку пути и создаем недостающее
- проверка ф-ции копирования на результат, если скопировало - возвращаем путь к новому файлу

Все ли верно?

  Ответить  
 
 автор: cheops   (12.04.2011 в 19:24)   письмо автору
 
   для: TetRiska   (12.04.2011 в 19:20)
 

>is_file($fullpath)
Не понятно откуда это? У вас же переменная $fullpath в функции вообще не определена.

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 19:32)   письмо автору
 
   для: cheops   (12.04.2011 в 19:24)
 

ой ошибся не fullpath, а folder

  Ответить  
 
 автор: cheops   (12.04.2011 в 19:36)   письмо автору
 
   для: TetRiska   (12.04.2011 в 19:32)
 

Хм... так folder это вроде директория? Тогда может лучше is_dir(), а не is_file()?

  Ответить  
 
 автор: cheops   (12.04.2011 в 19:26)   письмо автору
 
   для: TetRiska   (12.04.2011 в 19:20)
 

>$folder != ''
А нужно ли это условие? Получается нельзя создать копию файла в той же директории.

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 19:35)   письмо автору
 
   для: cheops   (12.04.2011 в 19:26)
 

>$folder != ''
этим же я проверяю прописан ли путь к директории куда копируем и причем тут
>А нужно ли это условие? Получается нельзя создать копию файла в той же директории.

  Ответить  
 
 автор: cheops   (12.04.2011 в 19:37)   письмо автору
 
   для: TetRiska   (12.04.2011 в 19:35)
 

Хорошо, пусть будет, в крайнем случае, если нужно будет создать копию файла в этой же директории, можно будет использовать ссылку на текущую директорию ./

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 19:40)   письмо автору
 
   для: cheops   (12.04.2011 в 19:37)
 

имена копируемого и нового файлов всегда разные, даже если пишем в ту же директорию, то перезаписи не произойдет...вроде я правильно понял, чего Вы опасались.....

а так по этапам проверок существования файла, папки, создание папки по условию, проверка ф-ции копирования...все верно?

  Ответить  
 
 автор: cheops   (12.04.2011 в 19:51)   письмо автору
 
   для: TetRiska   (12.04.2011 в 19:40)
 

Имена понятно... но что вы будете подставлять вместо $folder, если запись идет в ту же директорию? Как бы логично, что если запись идет в ту же самую директорию, то этот параметр можно оставить пустым, т.е. написать
file_copy($old, $new);

Тем более, вы спроектировали функцию так, что её синтаксис это позволяет. Однако, в результате файл не будет скопирован, так как условие $folder != '' не позволит выполниться ничему. Лучше если бы это условие, просто не позволяло создавать директорию, но позволяло копирование файлов.

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 20:05)   письмо автору
 
   для: cheops   (12.04.2011 в 19:51)
 

тогда так?
function file_copy($file='', $file_name='', $folder=''){
   if($file != '' && is_file($folder) == true && $file_name != ''){
      if(is_dir($folder))return true;
      $arr = explode('/', $folder);
      $prev = null;
      for($i=0;$i<count($arr);$i++){
          if(!is_dir($prev . $arr[$i] . '/')){
               mkdir($prev . $arr[$i] . '/', 0777);                  
          }
          $prev .= $arr[$i] . '/';
      }
      if(copy($file,$folder.$file_name)) return $folder.$file_name;
   }
}

на этапе
 if(is_dir($folder))return true;

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

если в ту же директорию копируем, то
file_copy('/files/test.jpg', 'test2.jpg');//скопирует в эту же директорию и назовет файл test2.jpg

а если в другую
file_copy('/files/test.jpg', 'test2.jpg','/files/new/');//скопирует в другую директорию и назовет файл test2.jpg

теперь верно?

  Ответить  
 
 автор: cheops   (12.04.2011 в 20:14)   письмо автору
 
   для: TetRiska   (12.04.2011 в 20:05)
 

>is_file($folder) == true
Зачем это условие? $folder - это директория, вероятно вы хотели проверить является ли файлом $file?

> if(is_dir($folder))return true;
Тогда у вас функция не дойдет до копирования файла - так как return - это выход из функции, лучше поставить проверку вида
if(!is_dir($folder))
{
  // Создаем не существующую директорию
}

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 20:39)   письмо автору
 
   для: cheops   (12.04.2011 в 20:14)
 

блин эта спешка...ошибся снова, исправил is_file($file)
function file_copy($file='', $file_name='', $folder=''){
   if($file != '' && is_file($file) == true && $file_name != ''){
     if(!is_dir($folder)){
          $arr = explode('/', $folder);
          $prev = null;
          for($i=0;$i<count($arr);$i++){
              if(!is_dir($prev . $arr[$i] . '/')){
                   mkdir($prev . $arr[$i] . '/', 0777);                  
              }
              $prev .= $arr[$i] . '/';
          }
      }
      if(copy($file,$folder.$file_name)) return $folder.$file_name;
   }
}

теперь должно быть верно?

  Ответить  
 
 автор: cheops   (12.04.2011 в 20:59)   письмо автору
 
   для: TetRiska   (12.04.2011 в 20:39)
 

Да, сейчас вроде все верно, только бы я еще вот эту конструкцию
          $arr = explode('/', $folder); 
          $prev = null; 
          for($i=0;$i<count($arr);$i++){ 
              if(!is_dir($prev . $arr[$i] . '/')){ 
                   mkdir($prev . $arr[$i] . '/', 0777);                   
              } 
              $prev .= $arr[$i] . '/'; 
          }
сократил бы до
mkdir($folder, 0777, true);
Третий параметр true позволяет создавать директории на всем протяжении пути, сколько бы их там не хватало. Одна строка встроенной функции всегда проще и надежнее - не будет соблазна потом поправить цикл и внести в него ошибку.

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 21:32)   письмо автору
 
   для: cheops   (12.04.2011 в 20:59)
 

круто сократилось, спасибо огромное, буду тестировать
интересно про mkdir с 3-мя параметрами, что если указать третий, то он будет создавать на протяжении всего пути папки...не слышал даже

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 21:58)   письмо автору
 
   для: cheops   (12.04.2011 в 20:59)
 

а вот один нюанс
function file_copy($file='', $file_name='', $folder=''){ 

может изменить на
function file_copy($file='', $file_name='', $folder){

т. е. не присваивать сразу $folder пустое значение? т.к. его может и не быть

  Ответить  
 
 автор: cheops   (12.04.2011 в 22:00)   письмо автору
 
   для: TetRiska   (12.04.2011 в 21:58)
 

Тогда придется отменять все значения по умолчанию перед $folder, так как параметры со значениями по умолчанию могут идти только в конце, после обязательных параметров. Иначе невозможно будет однозначно определить какой аргумент к какому параметру относится.

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 22:03)   письмо автору
 
   для: cheops   (12.04.2011 в 22:00)
 

тогда так оставлю. ведь не критично эту корректировку вносить?

  Ответить  
 
 автор: cheops   (12.04.2011 в 22:05)   письмо автору
 
   для: TetRiska   (12.04.2011 в 22:03)
 

Собственно это вопрос интерфейса - тут уже поступайте как вам удобнее. Хотя, конечно, так не принято делать, так как можно сделать вызов
file_copy();
и интерпретатор посчитает его правильным, хотя функция ничего сделать полезного не сможет. Я бы убрал вообще все = ''.

  Ответить  
 
 автор: TetRiska   (12.04.2011 в 22:39)   письмо автору
 
   для: cheops   (12.04.2011 в 22:05)
 

тогда минус проверка, но и структура же поменяется?
function file_copy($file, $file_name, $folder){
   if(is_file($file)){
     if(!is_dir($folder)){
          mkdir($folder, 0775, true);
      }
      if(copy($file,$folder.$file_name)) return $folder.$file_name;
   }

  Ответить  
 
 автор: cheops   (13.04.2011 в 00:03)   письмо автору
 
   для: TetRiska   (12.04.2011 в 22:39)
 

Ну в последнем варианте вроде все нормально, наличие $file проверяется при помощи is_file(), наличие $folder проверяется при помощи id_dir(), а $file_name мы создаем.

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

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