При копировании файла создается папка

118
02 июля 2019, 14:20

Есть массив с адресами и названием файлов

Array ( 
  [0] => /uploads/2017/04/provoloka.jpg
  [1] => /uploads/2017/02/provoloka-vyazalnaya.jpg
)

Нужно скопировать все файлы в папк 1, чтобы файлы имели вид

/1/uploads/2017/04/provoloka.jpg

Мой код

foreach ($value as $v) {//Перебираем массив
  $v=substr($v,1);//Убираем первый знак - /
  if (file_exists($v)) {//Проверяем существует ли фаил
    if(!file_exists('1/'.$v)) {//Проверяем скопирован ли файл
      //$t= explode('/', $v);//Из адреса делаем массив, чтобы убрать название файла
      //$s = [];//Создаем пустой массив
      //for($i=0; $i<count($t)-1; $i++) {//Перебираем массив с адресом файла
      //  $s[] = $t[$i];//Заносим все в массив
      //}
      //$d = implode('/',$s);//Получаем адрес к файлу без названия файла
      $d = dirname($v);
      if (file_exists($d)) {//Проверяем существует ли папка куда будем копировать
        copy($v, '1/'.$v);//Если есть то копируем файл
      } else {
        mkdir('1/'.$d, 0777, true);//Если папки нет, то создаем ее
        copy($v, '1/'.$v);// И копируем в нее файл
      }
    }
  } else {
    echo "The file $filename does not exist";
  }
}

Проблема заключается в том, что он вместо файла создает папку

В чем моя ошибка?

Answer 1

Если директория создана, значит такой путь был передан в аргументе функции. Судя по вашему коду, возможны были два варианта. Первый - опечатка в mkdir("1/$v") вместо $d, вторая - цикл < count($t), вместо < count($t) - 1, таким образом само имя файла тоже попадало в имя папки.

как мы уже выяснили проблема была в -1

Тем не менее, для решения задач старайтесь использовать подходящие инструменты. Например, не стоит разбирать пути самостоятельно, для этого есть соответствующие функции. Не стоит также и писать множество вложенных условий и т.п. Возможно лучше просто в несколько приемов подготовить данные, и потом также просто их обработать. Также постоянное конкатенация и вычисление пути повышает риск опечаток и снижает понятность и читаемость кода (не говоря уже о том, что при смене пути придется править каждую строку), а код должен быть прост как валенок, чем проще, тем лучше.

Вот пример кода (возможно с опечатками), в котором эти проблемы не так актуальны:

$files = [
          "/uploads/2017/04/provoloka.jpg",
          "/uploads/2017/02/provoloka-vyazalnaya.jpg"
        ];

// из какой директрию и в какую копируем
$sourceDir = dirname(__FILE__);
$targetDir = $sourceDir."1" ;
// пути для файлов
$data = array_map(function($f) use ($sourceDir, $targetDir){
                     return [
                        'from' => $sourceDir.$f,
                        'to'   => $targetDir.$f,
                    ];
                }, $files);
// фильтруем только то, что действительно следует копировать
$data = array_filter($data, function($c){
                    return file_exists($c['from']) 
                           && !file_exists($c['to']);
            });

// работаем с файлами
foreach($data as $c){
    $d = dirname($c['to']);
    if(!file_exists($d)){
        mkdir($d, 777, true);
    }
    copy($c['from'], $c['to']);
}

для особых эстетов, можно сделать $data = array_column($data, 'to', 'from') и цикл вида foreach($data as $from => $to){ ... }

READ ALSO
Переворот таблицы MS SQL

Переворот таблицы MS SQL

Всем привет! Есть такая таблица (допустим, Table_1)

144
Отсортировать массив по частоте

Отсортировать массив по частоте

Дана строка с целыми числами от 1 до 500, разделенных запятымиЧисла могут повторяться

154
Проверка структуры таблицы

Проверка структуры таблицы

Требуется функция или библиотека, чтобы подключить в проект

146