# File

class File extends SplFileInfo

A file in the file system.

## Methods

`public` | `` | `__construct(string $path, bool $checkPath = true)` | Constructs a new file from the given path. |
`public` | `string|null` | `guessExtension()` | Returns the extension based on the mime type. |
`public` | `string|null` | `getMimeType()` | Returns the mime type of the file. |
`public` | `File` | `move(string $directory, string $name = null)` | Moves the file to a new location. |
`protected` | `` | `getTargetFile($directory, $name = null)` | No description |
`protected` | `string` | `getName(string $name)` | Returns locale independent base name of the given path. |

## Details

at line 34

### `__construct()`

`public __construct(string $path, bool $checkPath = true)`

Constructs a new file from the given path.

#### Parameters

`string` | `$path` | The path to the file
`bool` | `$checkPath` | Whether to check the path or not

#### Exceptions

FileNotFoundException | If the given path is not a file

at line 56

### `guessExtension()`

`public string|null guessExtension()`

Returns the extension based on the mime type.

If the mime type is unknown, returns null.

This method uses the mime type as guessed by getMimeType() to guess the file extension.

#### Return Value

`string|null` | The guessed extension or null if it cannot be guessed

#### See also

ExtensionGuesser |
getMimeType() |

at line 75

### `getMimeType()`

`public string|null getMimeType()`

Returns the mime type of the file.

The mime type is guessed using a MimeTypeGuesser instance, which uses finfo(), mime_content_type() and the system binary "file" (in this order), depending on which of those are available.

#### Return Value

`string|null` | The guessed mime type (e.g. "application/pdf")

#### See also

MimeTypeGuesser |

at line 92

### `move()`

`public File move(string $directory, string $name = null)`

Moves the file to a new location.

#### Parameters

`string` | `$directory` | The destination folder
`string` | `$name` | The new file name

#### Return Value

`File` | A File object representing the new file

#### Exceptions

FileException | if the target file could not be created

at line 106

### `getTargetFile()`

`protected getTargetFile($directory, $name = null)`

#### Parameters

| `$directory` |
| `$name` |

at line 128

### `getName()`

`protected string getName(string $name)`

Returns locale independent base name of the given path.

#### Parameters

`string` | `$name` | The new file name

#### Return Value

`string` | containing

## Source code

    <?php

    /*
     * This file is part of the Symfony package.
     *
     * (c) Fabien Potencier <fabien@symfony.com>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */

    namespace App\Khan\Component\HttpFoundation\File;

    use App\Khan\Component\HttpFoundation\File\Exception\FileException;
    use App\Khan\Component\HttpFoundation\File\Exception\FileNotFoundException;
    use App\Khan\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
    use App\Khan\Component\HttpFoundation\File\MimeType\ExtensionGuesser;

    /**
     * A file in the file system.
     *
     * @author Bernhard Schussek <bschussek@gmail.com>
     */
    class File extends \SplFileInfo
    {
        /**
         * Constructs a new file from the given path.
         *
         * @param string $path      The path to the file
         * @param bool   $checkPath Whether to check the path or not
         *
         * @throws FileNotFoundException If the given path is not a file
         */
        public function __construct(string $path, bool $checkPath = true)
        {
            if ($checkPath && !is_file($path)) {
                throw new FileNotFoundException($path);
            }

            parent::__construct($path);
        }

        /**
         * Returns the extension based on the mime type.
         *
         * If the mime type is unknown, returns null.
         *
         * This method uses the mime type as guessed by getMimeType()
         * to guess the file extension.
         *
         * @return string|null The guessed extension or null if it cannot be guessed
         *
         * @see ExtensionGuesser
         * @see getMimeType()
         */
        public function guessExtension()
        {
            $type = $this->getMimeType();
            $guesser = ExtensionGuesser::getInstance();

            return $guesser->guess($type);
        }

        /**
         * Returns the mime type of the file.
         *
         * The mime type is guessed using a MimeTypeGuesser instance, which uses finfo(),
         * mime_content_type() and the system binary "file" (in this order), depending on
         * which of those are available.
         *
         * @return string|null The guessed mime type (e.g. "application/pdf")
         *
         * @see MimeTypeGuesser
         */
        public function getMimeType()
        {
            $guesser = MimeTypeGuesser::getInstance();

            return $guesser->guess($this->getPathname());
        }

        /**
         * Moves the file to a new location.
         *
         * @param string $directory The destination folder
         * @param string $name      The new file name
         *
         * @return self A File object representing the new file
         *
         * @throws FileException if the target file could not be created
         */
        public function move($directory, $name = null)
        {
            $target = $this->getTargetFile($directory, $name);

            if (!@rename($this->getPathname(), $target)) {
                $error = error_get_last();
                throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message'])));
            }

            @chmod($target, 0666 & ~umask());

            return $target;
        }

        protected function getTargetFile($directory, $name = null)
        {
            if (!is_dir($directory)) {
                if (false === @mkdir($directory, 0777, true) && !is_dir($directory)) {
                    throw new FileException(sprintf('Unable to create the "%s" directory', $directory));
                }
            } elseif (!is_writable($directory)) {
                throw new FileException(sprintf('Unable to write in the "%s" directory', $directory));
            }

            $target = rtrim($directory, '/\\').DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));

            return new self($target, false);
        }

        /**
         * Returns locale independent base name of the given path.
         *
         * @param string $name The new file name
         *
         * @return string containing
         */
        protected function getName($name)
        {
            $originalName = str_replace('\\', '/', $name);
            $pos = strrpos($originalName, '/');
            $originalName = false === $pos ? $originalName : substr($originalName, $pos + 1);

            return $originalName;
        }
    }