Index: units/helpers/file_helper.php =================================================================== --- units/helpers/file_helper.php (revision 14888) +++ units/helpers/file_helper.php (working copy) @@ -428,25 +428,31 @@ $parts = pathinfo($name); $ext = '.' . $parts['extension']; $filename = $parts['filename']; + $path = rtrim($path, '/'); + + $original_checked = false; $new_name = $filename . $ext; if ( $parts['dirname'] != '.' ) { - $path = rtrim($path, '/') . '/' . ltrim($parts['dirname'], '/'); + $path .= '/' . ltrim($parts['dirname'], '/'); } // make sure target folder always exists, especially for cases, // when storage engine folder is supplied as a part of $name $this->CheckFolder($path); - while ( file_exists($path . '/' . $new_name) || in_array(rtrim($path, '/') . '/' . $new_name, $forbidden_names) ) { - if ( preg_match('/(' . preg_quote($filename, '/') . '_)([0-9]*)(' . preg_quote($ext, '/') . ')/', $new_name, $regs) ) { - $new_name = $regs[1] . ($regs[2] + 1) . $regs[3]; + do { + if ( preg_match('/(.*)_([0-9]*)(' . preg_quote($ext, '/') . ')/', $new_name, $regs) ) { + $new_name = $regs[1] . '_' . ((int)$regs[2] + 1) . $regs[3]; } - else { + elseif ( $original_checked ) { $new_name = $filename . '_1' . $ext; } - } + $original_checked = true; + $res = file_exists($path . '/' . $new_name) || in_array($path . '/' . $new_name, $forbidden_names); + } while ($res !== false); + if ( $parts['dirname'] != '.' ) { $new_name = $parts['dirname'] . '/' . $new_name; }