# 处理文件

CodeIgniter 提供了一个 File 类，用于封装 SplFileInfo 类， 并提供一些额外的便捷方法。这个类也是 上传文件 和 图像 的基类。

## 获取 File 实例

通过在构造函数中传入文件路径，即可创建新的 File 实例。

    $file = new \CodeIgniter\Files\File($path);

默认情况下，文件不需要实际存在。不过，可额外传入参数 `true` 来检查文件是否存在； 如果不存在，则抛出 `FileNotFoundException()`。

## 利用 Spl 的能力

获得实例后，即可使用 `SplFileInfo` 类的完整功能，包括：

    // Get the file's basename
    echo $file->getBasename();
    // Get last modified time
    echo $file->getMTime();
    // Get the true real path
    echo $file->getRealPath();
    // Get the file permissions
    echo $file->getPerms();

    // Write CSV rows to it.
    if ($file->isWritable()) {
        $csv = $file->openFile('w');

        foreach ($rows as $row) {
            $csv->fputcsv($row);
        }
    }

## 新增功能

除了 SplFileInfo 类的全部方法外，File 还提供了一些新工具。

### getRandomName()

通过 `getRandomName()` 方法，可生成一个密码学安全的随机文件名，并在前面附加当前时间戳。 在移动文件时，这对于重命名文件特别有用，因为文件名将无法被猜测：

    // Generates something like: 1465965676_385e33f741.jpg
    $newName = $file->getRandomName();

### getSize()

返回文件大小，单位为字节：

    $size = $file->getSize(); // 256901

如果文件不存在或发生错误，将抛出 `RuntimeException`。

### getSizeByUnit()

自 4.6.0 版本弃用.

默认以字节为单位返回文件大小。第一个参数可传入 `'kb'` 或 `'mb'`， 分别以 KiB 或 MiB 返回结果：

    $bytes     = $file->getSizeByUnit(); // 256901
    $kilobytes = $file->getSizeByUnit('kb'); // 250.880
    $megabytes = $file->getSizeByUnit('mb'); // 0.245

如果文件不存在或发生错误，将抛出 `RuntimeException`。

### getSizeByBinaryUnit()

Added in version 4.6.0.

默认以字节为单位返回文件大小。第一个参数可传入不同的 FileSizeUnit 值， 分别以 KiB、MiB 等单位返回结果。第二个参数可传入精度值，用于定义小数位数。

    $bytes     = $file->getSizeByBinaryUnit(); // 256901
    $kibibytes = $file->getSizeByBinaryUnit(FileSizeUnit::KB); // 250.880
    $mebibytes = $file->getSizeByBinaryUnit(FileSizeUnit::MB); // 0.245

如果文件不存在或发生错误，将抛出 `RuntimeException`。

### getSizeByMetricUnit()

Added in version 4.6.0.

默认以字节为单位返回文件大小。第一个参数可传入不同的 FileSizeUnit 值， 分别以 kB、MB 等单位返回结果。第二个参数可传入精度值，用于定义小数位数。

    $bytes     = $file->getSizeByMetricUnit(); // 256901
    $kilobytes = $file->getSizeByMetricUnit(FileSizeUnit::KB); // 256.901
    $megabytes = $file->getSizeByMetricUnit(FileSizeUnit::MB); // 0.256

如果文件不存在或发生错误，将抛出 `RuntimeException`。

### getMimeType()

获取文件的媒体类型（MIME 类型）。在判定文件类型时，会尽可能使用被认为更安全的方 法：

    $type = $file->getMimeType();

    echo $type; // image/png

### guessExtension()

尝试基于可信的 `getMimeType()` 方法判断文件扩展名。如果 MIME 类型未知，则返回 null。与直接使用文件扩展名相比，这通常更可信。扩展名的判断依据为 app/Config/Mimes.php 中的值：

    // Returns 'jpg' (WITHOUT the period)
    $ext = $file->guessExtension();

### 移动文件

每个文件都可以使用 `move()` 方法移动到新位置。第一个参数为要移 动到的目录：

    $file->move(WRITEPATH . 'uploads');

默认使用原始文件名。第二个参数可传入新的文件名：

    $newName = $file->getRandomName();
    $file->move(WRITEPATH . 'uploads', $newName);

`move()` 方法会返回一个新的 File 实例，表示已重新定位的文件。因此，如需使 用新位置，必须保存返回结果：

    $file = $file->move(WRITEPATH . 'uploads');