<commit_before>---
layout:     post
title:      php之文件操作
category: blog
description: PHP SPL中提供了SplFileInfo和SplFileObject两个类来处理文件操作
---

**PHP SPL中提供了[SplFileInfo](http://www.phpddt.com/manual/php/res/class.splfileinfo.html)和SplFileObject两个类来处理文件操作**
#
**SplFileInfo用来获取文件详细信息**

```
$file = new SplFileInfo('foo-bar.txt');
print_r(array(
    'getATime' => $file->getATime(), //最后访问时间
    'getBasename' => $file->getBasename(), //获取无路径的basename
    'getCTime' => $file->getCTime(), //获取inode修改时间
    'getExtension' => $file->getExtension(), //文件扩展名
    'getFilename' => $file->getFilename(), //获取文件名
    'getGroup' => $file->getGroup(), //获取文件组
    'getInode' => $file->getInode(), //获取文件inode
    'getLinkTarget' => $file->getLinkTarget(), //获取文件链接目标文件
    'getMTime' => $file->getMTime(), //获取最后修改时间
    'getOwner' => $file->getOwner(), //文件拥有者
    'getPath' => $file->getPath(), //不带文件名的文件路径
    'getPathInfo' => $file->getPathInfo(), //上级路径的SplFileInfo对象
    'getPathname' => $file->getPathname(), //全路径
    'getPerms' => $file->getPerms(), //文件权限
    'getRealPath' => $file->getRealPath(), //文件绝对路径
    'getSize' => $file->getSize(),//文件大小，单位字节
    'getType' => $file->getType(),//文件类型 file  dir  link
    'isDir' => $file->isDir(), //是否是目录
    'isFile' => $file->isFile(), //是否是文件
    'isLink' => $file->isLink(), //是否是快捷链接
    'isExecutable' => $file->isExecutable(), //是否可执行
    'isReadable' => $file->isReadable(), //是否可读
    'isWritable' => $file->isWritable(), //是否可写
));
```

**SplFileObject继承SplFileInfo并实现RecursiveIterator , SeekableIterator接口 ，用于对文件遍历、查找、操作**

- 遍历：
```
try {
    foreach(new SplFileObject('foo-bar.txt') as $line) {
        echo $line;
    }
} catch (Exception $e) {
    echo $e->getMessage();
}
```

- 查找指定行：
```
try {
    $file = new SplFileObject('foo-bar.txt');
    $file->seek(2);
    echo $file->current();
} catch (Exception $e) {
    echo $e->getMessage();
}
```

- 写入csv文件：
```
$list  = array (
    array( 'aaa' ,  'bbb' ,  'ccc' ,  'dddd' ),
    array( '123' ,  '456' ,  '7891' ),
    array( '"aaa"' ,  '"bbb"' )
);
$file  = new  SplFileObject ( 'file.csv' ,  'w' );
foreach ( $list  as  $fields ) {
    $file -> fputcsv ( $fields );
}
```


###### 自己根据这些封装了一个文件操作的php类，可用于文件内容的读、写、文件的拷贝和移动、删除等……
#
**[fileSys.php]**
```
<?php
/**
 * 文件系统操作类
 * 
 */
class FileSystem {
    /**
     * 单例对象
     * 
     * @var FileSystem
     */
    private static $instance;
    
    private function __construct() {}
    
    /**
     * 获取单例
     * 
     * @return FileSystem
     */
    public static function getInstance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        
        return self::$instance;
    }

    /**
     * 读取文件内容
     * 
     * @param File $file 要读取的文件
     * @return string 
     */
    public function read(File $file) {
        if (!$file->exists()) {
            throw new \Exception("The specified file '{$file}' doesn't exist.");
        }
        return $file->content();
    }

    /**
     * 将内容数据写入文件
     * 
     * @param File $file 要被写入数据的文件
     * @param string $content 要写入的数据
     * @param boolean $append 是否为追加数据而不是覆盖，默认为覆盖
     * @return int
     */
    public function write(File $file, $content, $append = false) {
        if (!$file->exists()) {<commit_msg>Update 2016-06-26-php-filesys.md<commit_after>---
layout:     post
title:      php之文件操作
category: blog
description: PHP SPL中提供了SplFileInfo和SplFileObject两个类来处理文件操作
---

**PHP SPL中提供了[SplFileInfo](http://www.phpddt.com/manual/php/res/class.splfileinfo.html)和SplFileObject两个类来处理文件操作**
#
**SplFileInfo用来获取文件详细信息**

```
$file = new SplFileInfo('foo-bar.txt');
print_r(array(
    'getATime' => $file->getATime(), //最后访问时间
    'getBasename' => $file->getBasename(), //获取无路径的basename
    'getCTime' => $file->getCTime(), //获取inode修改时间
    'getExtension' => $file->getExtension(), //文件扩展名
    'getFilename' => $file->getFilename(), //获取文件名
    'getGroup' => $file->getGroup(), //获取文件组
    'getInode' => $file->getInode(), //获取文件inode
    'getLinkTarget' => $file->getLinkTarget(), //获取文件链接目标文件
    'getMTime' => $file->getMTime(), //获取最后修改时间
    'getOwner' => $file->getOwner(), //文件拥有者
    'getPath' => $file->getPath(), //不带文件名的文件路径
    'getPathInfo' => $file->getPathInfo(), //上级路径的SplFileInfo对象
    'getPathname' => $file->getPathname(), //全路径
    'getPerms' => $file->getPerms(), //文件权限
    'getRealPath' => $file->getRealPath(), //文件绝对路径
    'getSize' => $file->getSize(),//文件大小，单位字节
    'getType' => $file->getType(),//文件类型 file  dir  link
    'isDir' => $file->isDir(), //是否是目录
    'isFile' => $file->isFile(), //是否是文件
    'isLink' => $file->isLink(), //是否是快捷链接
    'isExecutable' => $file->isExecutable(), //是否可执行
    'isReadable' => $file->isReadable(), //是否可读
    'isWritable' => $file->isWritable(), //是否可写
));
```

**SplFileObject继承SplFileInfo并实现RecursiveIterator , SeekableIterator接口 ，用于对文件遍历、查找、操作**

- 遍历：

```
try {
    foreach(new SplFileObject('foo-bar.txt') as $line) {
        echo $line;
    }
} catch (Exception $e) {
    echo $e->getMessage();
}
```

- 查找指定行：

```
try {
    $file = new SplFileObject('foo-bar.txt');
    $file->seek(2);
    echo $file->current();
} catch (Exception $e) {
    echo $e->getMessage();
}
```

- 写入csv文件：
```
$list  = array (
    array( 'aaa' ,  'bbb' ,  'ccc' ,  'dddd' ),
    array( '123' ,  '456' ,  '7891' ),
    array( '"aaa"' ,  '"bbb"' )
);
$file  = new  SplFileObject ( 'file.csv' ,  'w' );
foreach ( $list  as  $fields ) {
    $file -> fputcsv ( $fields );
}
```


###### 自己根据这些封装了一个文件操作的php类，可用于文件内容的读、写、文件的拷贝和移动、删除等……
#
**[fileSys.php]**
```
<?php
/**
 * 文件系统操作类
 * 
 */
class FileSystem {
    /**
     * 单例对象
     * 
     * @var FileSystem
     */
    private static $instance;
    private function __construct() {}
    /**
     * 获取单例
     * 
     * @return FileSystem
     */
    public static function getInstance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    /**
     * 读取文件内容
     * 
     * @param File $file 要读取的文件
     * @return string 
     */
    public function read(File $file) {
        if (!$file->exists()) {
            throw new \Exception("The specified file '{$file}' doesn't exist.");
        }
        return $file->content();
    }

    /**
     * 将内容数据写入文件
     * 
     * @param File $file 要被写入数据的文件
     * @param string $content 要写入的数据
     * @param boolean $append 是否为追加数据而不是覆盖，默认为覆盖
     * @return int
     */
    public function write(File $file, $content, $append = false) {
        if (!$file->exists()) {
{'fraction_non_alphanumeric': 0.2007315957933242, 'fraction_numerical': 0.004572473708276178, 'mean_word_length': 2.739031339031339, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 111, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5086204', 'n_tokens_mistral': 2784, 'n_tokens_neox': 2840, 'n_words': 441}