2015-01-30 4 views
1

Я создаю файл-загрузчик и проверяет, существует ли файл в каталоге. Если он существует, я должен придумать новое имя для файла (I.E file.txt -> file1.txt). Не знаю, почему, но он продолжает генерировать ошибки. Вот мой код. Надеюсь, это не что-то больно очевидное.PHP Проверка наличия файла в каталоге

$directory = "files/"; 
$name = $_FILES['filename']['name']; 
$valid_name = true; 
$counter = 0; 
if(file_exists($directory . $_FILES['filename']['name'])) { 
    $valid_name = false; 
} 
while(!$valid_name){ 
    $name = $_FILES['filename']['name'] . $counter; 
    if(file_exists($directory . $name)){ 
     counter++; 
    } 
} 
+0

Какие конкретные ошибки делает ваш код генерировать? – showdev

+0

Какие ошибки являются конкретными ошибками, которые он генерирует? – Kmeixner

+3

U имеет бесконечный цикл. U следует переназначить valid_name после того, как файл существует. Check – DarkBee

ответ

1

Ваш код является неправильным. Это намного проще и понятнее.

$directory = "files/"; 
$counter = 0; 
$name = $_FILES['filename']['name']; 
while(file_exists($directory . $name)){ 
    $counter++; 
    $name = $_FILES['filename']['name'] . $counter; 
} 

Кроме того, ваш код не генерирует file.txt -> file1.txt но file.txt -> file.txt1 так делает это. Чтобы правильно сгенерировать его, используйте расширение и имя.

+0

Удивительный, спасибо! – mattegener

+0

'counter ++;' неверен. Это должно быть '$ counter ++;' – Sphinx

1

Вы забыли правильно назвать переменную при ее использовании:

$counter++; 
// not counter++ but $counter++; 
+0

Вот оно. Спасибо! – mattegener

+0

вы очень приветствуете матировщик. Я надеюсь получить помощь в любое время – lightup

1

Вы забыли изменить значение $valid_name. Во всяком случае, более простой способ сделать это просто:

$directory = "files/"; 
$counter = ""; 
while (file_exists($directory . $_FILES['filename']['name'] . $counter)) { 
    $counter++; 
} 
// Here the name is: $directory . $_FILES['filename']['name'] . $counter 

Учтите, что после того, как в первый раз $counter++ выполняется, то становится «1», а затем 2, и т.д. ...


меньший код, просто для удовольствия:

$c = ""; 
while (file_exists("files/".$_FILES['filename']['name'].$c)) $c++; 
// Here the name is: "files/".$_FILES['filename']['name'].$c 
+0

Синтаксическая ошибка на счетчике –

+0

Спасибо, исправлено =) – axelbrz

0

В коде есть ряд проблем, которые я перечислю, а затем очистка.

  1. Синтаксическая ошибка: счетчик не предваряются знаком $
  2. Styling: ваш код не отформатирован красиво и, следовательно, вы будете иметь больше времени на выявление проблем.
  3. Логический поток: вы проверяете наличие единственного имени файла, а не других.
  4. Вы не обрабатываете расширения файлов.

попробовать что-то вроде этого:

$directory = "files/"; 
    $path = pathinfo($directory . $_FILES['filename']['name']); 
    $name = $path['filename']; 
    $counter = 0; 

    while (file_exists($path['dirname'] . $path['basename'])) { 
      $counter++; 
      $path['filename'] = $name . $counter; 
    } 

    $outputFile = $path['dirname'] . $path['filename'] . '.' . $path['extension']; 
+0

Я не включил его ранее, но он отвергает что-либо, кроме простого/текстового файла. – mattegener

+0

В этом случае вы можете просто заменить $ path ['extension'] на 'txt' –