2015-12-02 169 views
3

我已經構建了一個用於創建文件的類;使用PHP創建文件和目錄

這是類,我有:

<?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); 
+0

[基本名(http://php.net/manual/en/function .basename.php)會給出文件名,然後你只能爆炸它。 – mrun

+0

太棒了!我會放手一搏! –

+0

也可以嘗試不使用帶空格的目錄名稱,使用'date(「j-M-Y」)'以便稍後可以安全地解析它 –

回答

2

您可以檢查出的basename功能將只返回文件名,那麼你只能使用它。

0

與@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; 
}