使用 PHP 作为 class 来创建文件和目录

Using PHP for a class to make files and directories

我构建了一个 class 用于创建文件;

这是我拥有的class:

<?php
class XLSX
{
    /** @var resource */
    private $handle;
    /** @var array */
    private $data;
    /** @var array */
    private $headings;
    /** @var bool */
    private $finished = true;
    /** @var string */
    private $filename;

    /**
     * Creates the class, must be done each time a file is written to as the handle is stored.
     * @param string $filename The file to be written to, will create the file if it does not exist
     */
    public function __construct($filename)
    {
        $this->MakeDir(dirname($filename));
        $this->MakeFile($filename);
        $this->finished = false;
    }

    /**
     * Set the headers for the XSLX
     * @param array $headers
     * @return bool
     */
    public function SetHeaders($headers)
    {
        return $this->AddToArray("headings", $headers);
    }

    /**
     * Get the headers that were set, if not set return null.
     * @return array|null
     */
    public function GetHeaders()
    {
        return !empty($this->headings) ? $this->headings : null;
    }

    /**
     * Set the data for the XSLX
     * @param array $headers
     * @return bool
     */
    public function SetData($data)
    {
        return $this->AddToArray("data", $data);
    }

    /**
     * Get the data that was set, if not set return null.
     * @return array|null
     */
    public function GetData()
    {
        return !empty($this->data) ? $this->data : null;
    }

    /**
     * Get the filename
     * @return string
     */
    public function GetFilename()
    {
        return $this->filename;
    }

    /**
     * Write the data that is needed for the file to the file
     * @return bool
     */
    public function Write()
    {
        if (!$this->finished && isset($this->handle))
        {
            if ($this->GetHeaders() == null || $this->GetData() == null)
            {
                return false;
            }
            foreach ($this->GetHeaders() as $header)
            {
                fwrite($this->handle, $header . "\t");
            }
            fwrite($this->handle, "\n");
            foreach ($this->GetData() as $data)
            {
                if (is_array($data))
                {
                    foreach ($data as $d)
                    {
                        fwrite($this->handle, $d . "\t");
                    }
                    fwrite($this->handle, "\n");
                }
                else
                {
                    fwrite($this->handle, $data . "\t");
                }
            }
        }
        return false;
    }

    /**
     * Set the handle and all data back to default, ready to recall a new instance.
     * @return void
     */
    public function Finish()
    {
        fclose($this->handle);
        $this->handle = null;
        $this->data = null;
        $this->headings = null;
        $this->finished = true;
        $this->filename = null;
    }

    /**
     * Count the amount of working days in a month
     * @param integer $year 
     * @param integer $month 
     * @return double|integer
     */
    public function CountDays($year, $month)
    {
        $count = 0;
        $counter = mktime(0, 0, 0, $month, 1, $year);
        while (date("n", $counter) == $month)
        {
            if (in_array(date("w", $counter), array(0, 6)) == false)
            {
                $count++;
            }
            $counter = strtotime("+1 day", $counter);
        }
        return $count;
    }

    /**
     * Makes a directory
     * @param string $dirname 
     */
    private function MakeDir($dirname)
    {
        if (!is_dir($dirname))
        {
            @mkdir($dirname, 777, true) ?: die("Failed to create the required directory.");
        }
    }

    /**
     * Creates a file to be used
     * @param string $filename 
     */
    private function MakeFile($filename)
    {
        if (file_exists($filename))
        {
            for ($i = 1; $i <= 200; $i++)
            {
                $fname = basename($filename);
                $base = str_replace($fname, "", $filename);
                $explded_base_name = explode(".", $fname);
                if (!file_exists("{$base}{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}"))
                {
                    $this->handle = fopen("{$base}{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}", "w");
                    $this->filename = $base . str_replace(" ", "%20", "{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}");
                    break;
                }
            }
        }
        else
        {
            $this->handle = fopen($filename, "w");
            $this->filename = $filename;
        }
    }

    /**
     * Add items to an array
     * @param string $arrayName
     * @param mixed $values
     * @return bool
     */
    private function AddToArray($arrayName, $values)
    {
        if (!$this->finished)
        {
            foreach($values as $val)
            {
                $this->{$arrayName}[] = $val;
            }
        }
        return !empty($this->{$arrayName}) ? true : false;
    }
}
?>

现在,除了一个症结点外,这很好用;在我的服务器上创建文件名的方式。

为此,我将 /var/www/vhosts/mysite.co.uk/_exports/payslips/ 作为我尝试写入的目录。正如您在我的代码中看到的那样,我有这一行:

$fname = explode(".", $filename);

但是,当重建文件名时,这会导致问题,例如,我的文件名是:

/var/www/vhosts/mysite.co
// Should be:
/var/www/vhosts/mysite.co.uk/_exports/payslips/02 Dec 2015/{username}.xls

__construct 方法中重建文件名的最佳方法是什么?

我是这样使用的:

$fname = "/var/www/vhosts/mysite.co.uk/_exports/payslips/" . date("j M Y") . "/" . $_SESSION['loginUsername'] . ".xls";
$xlsx = new XLSX($fname);

您可以查看 basename 函数,它将 return 仅文件名,然后您只能使用它。

在@mrun 的帮助下,这是已经制定的解决方案(发布仅供帮助人们):

/**
 * Creates the class, must be done each time a file is written to as the handle is stored.
 * @param string $filename The file to be written to, will create the file if it does not exist
 */
public function __construct($filename)
{
    $dirname = dirname($filename);
    if (!is_dir($dirname))
    {
        @mkdir($dirname, 777, true) ?: die("Failed to create the required directory.");
    }
    if (file_exists($filename))
    {
        for ($i = 1; $i <= 200; $i++)
        {
            $fname = basename($filename);
            $base = str_replace($fname, "", $filename);
            $explded_base_name = explode(".", $fname);
            if (!file_exists("{$base}{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}"))
            {
                $this->handle = fopen("{$base}{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}", "w");
                $this->filename = $base . str_replace(" ", "%20", "{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}");
                break;
            }
        }
    }
    else
    {
        $this->handle = fopen($filename, "w");
        $this->filename = $filename;
    }
    $this->finished = false;
}      mkdir($dirname, 0777, true) ?: die("Failed to create the required directory.");
    }
    if (file_exists($filename))
    {
        for ($i = 1; $i <= 200; $i++)
        {
            $fname = basename($filename);
            $base = str_replace($fname, "", $filename);
            $explded_base_name = explode(".", $fname);
            if (!file_exists("{$base}{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}"))
            {
                $this->handle = fopen("{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}", "w");
                $this->filename = $base . str_replace(" ", "%20", "{$explded_base_name[0]}_{$i}.{$explded_base_name[1]}");
                break;
            }
        }
    }
    else
    {
        $this->handle = fopen($filename, "w");
        $this->filename = $filename;
    }
    $this->finished = false;
    print $this->filename;
}