使用PHP创建文件和目录的类

使用PHP创建文件和目录的类,php,filenames,explode,xls,Php,Filenames,Explode,Xls,我构建了一个用于创建文件的类 这是我的课程: <?php class XLSX { /** @var resource */ private $handle; /** @var array */ private $data; /** @var array */ private $headings; /** @var bool */ private $finished = true; /** @var string */

我构建了一个用于创建文件的类

这是我的课程:

<?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
// Should be:
/var/www/vhosts/mysite.co.uk/_exports/payslips/02 Dec 2015/{username}.xls
\u construct
方法中重建此文件名的最佳方法是什么

我是这样使用的:

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

您可以签出只返回文件名的函数,然后只能使用它。

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

/**
*创建类,必须在每次存储句柄时写入文件。
*@param string$filename要写入的文件,如果不存在,将创建该文件
*/
公共函数构造($filename)
{
$dirname=dirname($filename);
如果(!is_dir($dirname))
{
@mkdir($dirname,777,true)?:die(“未能创建所需的目录”);
}
如果(文件_存在($filename))
{
对于($i=1;$i handle=fopen(“{$base}{$explated_base_name[0]}}{$i}.{$explated_base_name[1]}”,“w”);
$this->filename=$base.str_replace(“,“%20”,“{$explated_base_name[0]}}{$i}.{$explated_base_name[1]}”);
打破
}
}
}
其他的
{
$this->handle=fopen($filename,“w”);
$this->filename=$filename;
}
$this->finished=false;
}mkdir($dirname,0777,true)?:die(“未能创建所需的目录”);
}
如果(文件_存在($filename))
{
对于($i=1;$i handle=fopen(“{$explated_base_name[0]}}{$i}.{$explated_base_name[1]}”,“w”);
$this->filename=$base.str_replace(“,“%20”,“{$explated_base_name[0]}}{$i}.{$explated_base_name[1]}”);
打破
}
}
}
其他的
{
$this->handle=fopen($filename,“w”);
$this->filename=$filename;
}
$this->finished=false;
打印$this->filename;
}

将给出文件名,然后您只能将其分解。太棒了!我会尝试一下!您也可以尝试不使用带空格的目录名,使用
日期(“j-M-Y”)
以便以后可以对其进行分析safely@mrun,你什么意思?
loginUsername
只用于文件名,不用于目录?@Sam是的,没关系。这里有点混乱。这就是我删除注释的原因:)
$fname = "/var/www/vhosts/mysite.co.uk/_exports/payslips/" . date("j M Y") . "/" . $_SESSION['loginUsername'] . ".xls";
$xlsx = new XLSX($fname);
/**
 * 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;
}