使用 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;
}
我构建了一个 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;
}