0

[CakePHP] Folder và File Utilities

Chúng ta đã cùng nhau tìm hiểu khá nhiều về những Helper hữu ích trong View của CakePHP, giờ chúng ta sẽ tiếp tục đến với một phần mới tôi nghĩ cũng rất có ích đó là Utilities. Và trong bài này, tôi sẽ trình bày về một phần trong đó : Folder và File. Chúng là tập hợp những class sẽ có ích trong việc tương tác với những thư mục và tập tin, chúng giúp bạn đọc, ghi ra files, list ra cho bạn những files có trong thư mục nào đó ...

I) Khái quát

Đầu tiên hãy đi vào cách sử dụng. Bước đầu tiên là bạn cần chắc chắn rằng bạn đã load chúng lên bằng cách gọi :

<?php
App::uses('Folder', 'Utility');
App::uses('File', 'Utility');

Đến bước thứ hai là bạn khai báo cho CakePHP biết bạn sẽ tương tác với thư mục nào bằng cách khai báo đường dẫn của nó :

<?php
$dir = new Folder('/path/to/folder');

Kế đến là bạn sẽ dùng biểu thức chính quy để tìm những loại file nào muốn tương tác, ví dụ đó là những files View trong CakePHP :

<?php
$files = $dir->find('.*\.ctp');

Cuối cùng bạn đã có một danh sách các files View và có thể tương tác với chúng như đọc nội dung hay thêm nội dung hoặc đơn giản là xóa chúng đi. Đó là các bước chính, còn giờ ta sẽ đi vào chi tiết các hàm mà Utilities này cung cấp.

II) Các hàm về Folder

1) Folder(string $path = false, boolean $create = false, string|boolean $mode = false)

Trong đó $path là đường dẫn tới thư mục hiện hành, $create sẽ quyết định thư mục được tạo mới hay không, $mode thì chỉ sử dụng trên Linux để xác định permission khi tạo thư mục và mặc định là quyền 0755. Dòng dưới sẽ tạo ra một thư mục tên "test" trong đường dẫn "/Desktop/", set quyền 0766 cho nó.

<?php
$dir = new Folder('/Desktop/test', true, 0766);

2) cd(string $path)

Như câu lệnh cd thì hàm này sẽ đổi đường dẫn sang một thư mục khác hiện tại. Tuy nhiên, nó sẽ trả về false nếu thất bại, như khi không tồn tại $path chẳng hạn.

<?php
$folder = new Folder('/abc');
echo $folder->path; // Prints /abc
$folder->cd('/xxx');
echo $folder->path; // Prints /xxx

3) chmod(string $path, integer $mode = false, boolean $recursive = true, array $exceptions = array())

Giống như cái tên của nó thì hàm sẽ thay đổi mode cho thư mục của bạn :

$dir->chmod('/xxx', 0777, true, array('skip_me.php'));

Qua các tham số bạn có thể nhận thấy nếu để $recursive = true thì toàn bộ thư mục cũng như files cấp dưới nó để sẽ được thay đổi mode, còn $exceptions sẽ cho phép bạn khai báo một mảng các files không chịu sự thay đổi này.

4) copy(array|string $options = array())

Hàm này copy toàn bộ nội dung của thư mục. Tham số truyền vào có thể chỉ là đường dẫn hoặc là cả một mảng những lựa chọn. Hãy xét ví dụ sau để hiểu rõ hơn :

copy('/abc');
// lúc này toàn bộ nội dung thư mục /xxx sẽ được copy đến thư mục /abc

$folder->copy(array(
    'to' => '/xyz',
    'from' => '/abc', // khi dùng 'from' thì hàm cd() sẽ được gọi
    'mode' => 0676,
    'skip' => array('bo_qua.php', '.git'),
    'scheme' => Folder::SKIP  // những thư mục hay tập tin đã có ở /xyz sẽ ko được copy từ /abc đến nữa
));

Như bạn thấy SKIP được khai báo để không copy những thư mục hay files đã tồn tại ở thư mục đích. Ngoài ra CakePHP còn hỗ trợ MERGE, tức là sẽ kết hợp nội dung của cả 2 thư mục. Nếu có file tồn tại ở thư mục đích thì nó sẽ bị thay thế bởi file ở thư mục nguồn. Cuối cùng là OVERWRTIE sẽ cho phép bạn ghi đè những files hay thư mục đã tồn tại trong thư mục đích. Nếu cả hai thư mục nguồn và đích có cùng thư mục con thì nội dung thư mục đích sẽ được thay thế bởi thư mục nguồn.

Chú ý là 3 lựa chọn này chỉ được thêm vào từ bản 2.3.

5) create(string $pathname, integer $mode = false)

Hàm này hỗ trợ bạn tạo một cấu trúc các thư mục nhiều tầng, kiểu như /abc/def/ghi/kmn/lop.

6) delete(string $path = null)

Không phải nói thì bạn cũng đã rõ, hàm này sẽ xóa bỏ thư mục cũng như các files và thư mục con trong nó theo $path. Tất nhiên, bạn phải chú ý là có quyền xóa thư mục đó hay không. Và nếu $path là null thì sẽ xóa thư mục hiện hành.

7) dirsize()

Như cái tên của nó, nếu bạn cần biết kích thước của cả thư mục bao gồm tất cả những gì bên trong thì hãy dùng dirsize().

** 8) find(string $regexpPattern = '.*', boolean $sort = false)**

Nếu bạn cần tìm một hay nhiều file trong thư mục hiện hành thì có thể sử dụng hàm này, nó nhận vào biểu thức chính quy để tìm kiếm và thêm lựa chọn là có sắp xếp các files tìm được hay không. Ví dụ :

<?php
// Tìm tất cả các files có đuôi ảnh .png trong thư mục ảnh của ứng dụng : app/webroot/img/
$dir = new Folder(WWW_ROOT . 'img');
$files = $dir->find('.*\.png', true);  // có thực hiện sắp xếp
/* Giả sử bạn có các files sau
Array
(
    [0] => icon.png
    [1] => icon1.png
    [2] => update.png
    [3] => version.png
)
*/

9) findRecursive(string $pattern = '.*', boolean $sort = false)

Chức năng cũng giống với hàm find() song nó sẽ tìm cả trong thư mục hiện hành lẫn thư mục dưới nữa. Nhưng hai hàm này chỉ tìm files, còn bạn muốn tìm cả folders thì có thể dùng read()tree() bên dưới.

10) read(boolean $sort = true, array|boolean $exceptions = false, boolean $fullPath = false)

Hàm này sẽ đọc thư mục hiện hành và trả về cho bạn một mảng bao gồm hai mảng con lần lượt chứa các thư mục bên dưới của thư mục hiện hành, còn lại là mảng con chứa danh sách các files. Bạn cũng có thể sắp xếp được bằng tham số $sort = true, với $exceptions thì bạn có thể định nghĩa được một mảng các thư mục hoặc files nằm ngoài đối tượng đọc của hàm. Còn bạn để $exceptions = true thì CakePHP sẽ hiểu là bạn bỏ qua các file ẩn hoặc là file có dấu chấm ở đầu. Trường hợp bạn muốn lấy đường dẫn đầy đủ của các thư mục hay files thì cần set $fullPath = true.

11) tree(null|string $path = null, array|boolean $exceptions = true, null|string $type = null)

tree() về cơ bản cũng giống read() nhưng nó sẽ trả về cho bạn một mảng nested nhưng thư mục và cả files bên trong mỗi thư mục đó.

III) Các hàm về File

1) File(string $path, boolean $create = false, integer $mode = 755)

Cũng giống như Folder(), chỉ khác là hàm này sẽ tạo ra một file.

<?php
$file = new File('/abc/test.php', true, 0777);

2) append(string $data, boolean $force = false)

Hàm này sẽ thực hiện thêm $data vào cuối file và trả về true nếu thành công, false nếu thất bại.

3) close()

Đóng lại file nếu nó đang được mở. Nó cũng sẽ trả về giá tri boolean như append().

4) copy(string $dest, boolean $overwrite = true)

Nếu bạn muốn sao chép file nào đó đến thư mục $dest, hàm này sẽ giúp bạn. Trường hợp bạn để $overwrite = true thì nó sẽ ghi đè file trùng ở thư mục đích. Và nó cũng sẽ trả về giá tri boolean.

5) create() và delete()

Rất đơn giản là create() sẽ tạo ra một file cho bạn, còn delete() sẽ xóa bỏ file đi khi không còn cần nữa.

6) executable(), exists(), ext(), Folder(), info(), name(), perms(), pwd(), readable(), size(), writable(), mime()

Như các bạn thấy, tôi gộp rất nhiều hàm như bên trên bởi vì chúng rất đơn giản. Đó là một loạt các hàm hữu ích giúp bạn lấy được những thông tin về file. Cụ thể, lần lượt các hàm trên :

  • executable() : trả về true nếu file có thể execute được.
  • exists() : trả về true nếu file có tồn tại.
  • ext() : trả về chuỗi là đuôi mở rộng của file.
  • Folder() : trả về thư mục hiện tại của file đó.
  • info() : trả về một mảng chứa các thông tin về file.
  • name() : cho bạn tên file và không bao gồm cả phần mở rộng.
  • perms() : sẽ cho bạn biết file đang chịu quyền gì.
  • pwd() : nếu bạn cần đường dẫn đầy đủ của file, hãy dùng hàm này.
  • readable() : sẽ trả về true nếu file có thể đọc được.
  • size() : cho biết kích cỡ file của bạn.
  • writable() : bạn muốn biết nội file có thể can thiệp không thì hãy dùng hàm này.
  • mime() : trả về kiểu Mime của file.

7) read(string $bytes = false, string $mode = 'rb', boolean $force = false)

Hàm này sẽ đọc nội dung của file dưới dạng string, trường hợp không thể đọc thì nó sẽ trả về false.

8) write(string $data, string $mode = 'w', boolean$force = false)

Còn write() sẽ giúp bạn ghi $data vào file đang thao tác.

9) replaceText($search, $replace)

Cuối cùng trong chuỗi các hàm về File, sẽ là hàm giúp bạn thay thế một chuỗi $search có trong file bằng chuỗi $replace. Nhưng nếu không tìm thấy $search hay vì lý do khác mà không thực hiện được thì nó sẽ trả về false. Ngược lại trả về true khi thành công.

Chú ý là bạn chỉ dùng được hàm này từ bản 2.5 mà thôi.

Vậy là chúng ta đã kết thúc tìm hiểu một loạt các hàm hữu ích liên quan đến thao tác với Folder và File mà CakePHP cung cấp. Hy vọng bài viết sẽ có ích cho bạn trong việc tìm hiểu về CakePHP cũng như áp dụng được vào các ứng dụng mà bạn phát triển.

To be continued ...


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí