Thao tác xử lý thư mục và tập tin


tự học php nâng cao 22/07/2015 Cùng chuyên mục

Xử lý tập tin và thư mục là một phần quan trọng của nhiều ứng dụng web. Chúng ta thường mở file để xử lý để đáp ứng nhiều nhu cầu khác nhau như đọc - ghi file - lấy thông tin - phân quyền (chmod) file và folder

XỬ LÝ FILE:

PHP cung cấp khá nhiều hàm để tạo mới, biên tập, đọc, lấy thông tin,...file. Phần lớn tên hàm
chúng bắt đầu bằng ký tự 'f'. Dưới đây là các hàm thường dùng để xử lý file:

  • fopen(): Mở 1 handle để xử lý local file (file trên hệ thống), hoặc file từ URL
  • fread(): Đọc một khối dữ liệu từ file
  • fgets(): Đọc dữ liệu từ file theo từng dòng
  • fwrite() / fputs: ghi một khối dữ liệu vào file
  • fclose(): đóng 1 handle được tạo ra bởi hàm fopen().
  • feof(): Trả về kết quả TRUE - nếu ở cuối file

MỞ FILE:

Ví dụ: Mở file bằng hàm fopen(string $filename, string $mode) - kết quả trả ra là 1 handle
có kiểu resource. Trong đó $filename là đường dẫn tới file xử lý. Nếu chỉ có tên file thì lấy ngay
tại thư mục đang thực thi script. Có thể sử dùng đường dẫn tương đối
như: /../data.dat (tập tin data.dat ở thư mục cha của thư mục hiện tại)
hoặc đường dẫn tuyệt đối: C:/work/data.dat - hoặc một url: http://example.com 

<?php
/*mở file data.txt - với chế độ mở file là chỉ đọc*/
$f = fopen("data.dat","r");
if(!$f)
{
echo 'Không thể mở được file';
}
/*đọc 1 dòng dữ liệu*/
$line = fgets($f);
echo $line;
/*đóng file*/
fclose($f);
?>

Lưu ý: không quên đóng file
Có các chế độ mở file sau:
- r : chỉ đọc. Con trỏ file được đặt ở đầu file và chỉ cho phép đọc dữ liệu từ file
- r+: Con trỏ file được đặt ở đầu file cho phép đọc và ghi dữ liệu
- w: Con trỏ đặt ở đầu file, chỉ cho phép ghi dữ liệu. Nếu file đã có dữ liệu sẽ xóa hết
dữ liệu cũ, nếu file chưa được tạo sẽ được tạo mới.
- w+: Con trỏ đặt ở đầu file, cho phép đọc và ghi dữ liệu, nếu file đã có dữ liệu sẽ
xóa hết dữ liệu cũ, nếu file chưa được tạo sẽ tạo ra file mới.
- a: Con trỏ đặt ở cuối file, chỉ cho phép ghi dữ liệu, nếu file chưa được tạo sẽ tạo ra file mới.
a+: Con trỏ đặt ở cuối file, cho phép đọc và ghi dữ liệu, nếu file chưa được tạo sẽ tạo ra file mới.

GHI DỮ LIỆU:

Ví dụ, ghi dữ liệu bằng hàm fwrite(resource $file, string $data) ghi chuỗi 'Hello world' vào file data.dat

<?php
/*mở file bằng chế độ chỉ ghi*/
$f = fopen("data.dat","w");
if(!$f)
{
echo 'Không thể mở file!';
}
$data = "Hello world";
fwrite($f,$data); //file data.dat: Hello world
fwrite($f," 123"); //file data.dat: Hello world 123
fclose($f);
?>

ĐỌC DỮ LIỆU:

Ví dụ, đọc dữ liệu từ file data.dat đã ghi ở trên bằng hàm fread(resource $file, int $length);
length là độ dài dữ liệu, tính bằng byte

<?php
/*mở file bằng chế độ chỉ ghi*/
$f = fopen("data.dat","r");
if(!$f)
{
echo 'Không thể mở file!';
}
echo fread($f,filesize($f)); //hàm filesize(): lấy ra kích thước file, tính theo byte
echo fread($f,6); //đọc 6 byte dữ liệu - tính từ đầu file
fclose($f);
?>

- Đọc dữ liệu theo từng dùng, sử dụng hàm fgets()
- Đọc từng ký tự, sử dụng hàm fgetc()
Ví dụ, đọc và in ra dạng chữ hoa của các ký tự đọc được trong file data.dat

<?php
/*mở file ở chế độ chỉ đọc*/
$f = fopen("data.dat","r");
if(!$f)
{
echo 'Không thể mở file!';
}
/*đọc dữ liệu cho đến hết file*/
while(!feof($f))
{
echo strtoupper(fgetc($f));
}
/*đóng file*/
fclose($f);
?>

Lưu ý: muốn file ghi được dữ liệu - nó phải có quyền ghi - thư mục chứa file phải có quyền ghi
Tương tự cho việc đọc dữ liệu

XÓA FILE:

Sử dụng hàm unlink(string $filename) - để xóa một file, thư mục xóa file phải có quyền ghi.
Kết quả trả về TRUE nếu xóa được - FALSE nếu có lỗi.

<?php
if(unlink("data.dat"))
{
echo 'Xóa file thành công';
}
else
{
echo 'Có lỗi! kiểm tra lại đường dẫn, sự tồn tại của file!';
}
?>

Sao chép tận tin (copy file)

Để sao chép tập tin sử dụng hàm copy() - cú pháp:

bool copy(string $source, string $dest)

Trong đó:

  • $source: là đường dẫn tới file nguồn
  • $dest: đường dẫn tới file đích

Ví dụ: copy file data.dat vào thư mục con của thư mục hiện hành, giả sử tên là copy

<?php
	$file = "data.dat";
	$new_file = "/copy/data.dat";
	if(copy($file,$new_file))
	{
		echo 'copy file thành công';
	}
	else
	{	
		echo 'copy file thất bại';
	}
?>

ĐỔI TÊN THƯ MỤC TẬP TIN

Sử dụng hàm rename() - để đổi tên cho thư mục hoặc tập tin 

bool rename(string $oldname, string $newname)

Trong đó:

  • $oldname: là đường dẫn tới file với tên cũ
  • $newname: là đường dẫn tới file với tên mới
<?php
	$file = "data.dat";
	$new_file = "dulieu.dat";
	if(rename($file,$new_file))
	{
		echo 'doi ten file thành công';
	}
	else
	{	
		echo 'doi ten file thất bại';
	}
?>

Một số hàm kiểm tra file:

- is_file(string $filename): trả ra TRUE nếu là một file
- filetype(string $filename): trả ra một chuỗi - 'dir' nếu là thư mục, 'file' nếu là tập tin
- file_exists(string $filename): trả ra TRUE nếu tồn tại File hoặc thư mục
- mime_content_type(string $filename): trả ra một chuỗi, loại file như Image/gif: file ảnh,
định dạng gif - text/plain: file văn bản - application/... file ứng dụng
- is_writable(string $filename): trả ra TRUE nếu file/thư mục có thể ghi
- is_readable(string $filename): trả ra TRUE nếu file/thư mục có quyền đọc

XỬ LÝ THƯ MỤC:

Sử dụng hàm mkdir(string $path, [int $mode = 0777]) để tạo một thư mục, hàm trả về TRUE
nếu tạo được thư mục (thư mục cha phải có quyền ghi). 
Sử dụng hàm rmdir(string $path) để xóa một thư mục - hàm trả về TRUE nếu xóa thành công

	if(mkdir("my_dir"))
	{
		echo 'Tạo thư mục my_dir thành công';
	}
	/*xem đã có thư mục my_dir chưa*/
	var_dump(file_exists("my_dir"));
	//xóa thư mục
	rmdir("my_dir");
	/*xem sau khi thực hiện lệnh xóa còn thư mục my_dir nữa không*/
	var_dump(file_exists("my_dir"));
	//TẠO FILE data.dat
	$f = fopen("data.dat","w");
	fclose($f);
	//kiểm tra có thể ghi dữ liệu
	var_dump(is_writable("data.dat"));
	//phân quyền chỉ đọc 
	chmod("data.dat",0404);
	//kiểm tra có thể ghi dữ liệu
	var_dump(is_writable("data.dat"));
	//kiểm tra có thể đọc dữ liệu
	var_dump(is_readable("data.dat"));

Đôi khi bạn muốn đổi quyền cho thư mục hoặc tập tin theo ý mình thông qua mã lệnh php mà không
cần phải thông qua các trình quản lý như cpanel,... Sử dụng hàm chmod sẽ giúp bạn làm điều này:
bool chmod(string $filename, int $mode); - $filename là đường dẫn của tập tin hoặc thư mục, $mode là quyền của thư mục hoặc tập tin như 0777 - 0700 - 0755,...

Ví dụ: bạn muốn thư mục 'tmp' là thư mục upload hình ảnh - nhưng chỉ khi nào upload thì nó mới
có quyền ghi dữ liệu, còn bình thường nó chỉ có quyền đọc và thực thi.

if(file_exists("tmp"));
{
chmod("tmp",0777);
//code upload file
chmod("tmp",0646);
}

- Sử dụng hàm getcwd() lấy vị trí thư mục hiện hành (thư mục đang thực thi đoạn mã php).
- Sử dụng hàm chdir(string $path): để chuyển đổi vị trí thư mục hiện hành, kết quả trả ra TRUE 
nếu thành công.

<?php
mkdir("csv");
echo "Thư mục hiện hành: ".getcwd()."
";
chdir("csv");
echo "Thư mục hiện hành: ".getcwd()."
";
?>

TỔNG KẾT

Sau bài này, các bạn biết cách thao tác với tập tin thư mực, cần nắm vững các điểm sau:
- Đường dẫn, đường dẫn tương đối, đường dẫn tuyệt đối ( tương tự như trong HTML CSS )
- Mở file, các chế độ mở file
- Các kiểu đọc và ghi dữ liệu
- Một số thao tác tới thư mục như tạo mới, xóa, phân quyền,...




Bình luận:


php