Bài viết này sẽ xoay quanh về nội dung của các hàm xử lý và làm việc với file trong PHP. Đối với một ngôn ngữ lập trình, làm việc với file và thư mục là điều bắt buộc mà không thể tránh khỏi. Vấn đề xử lý file trong PHP rất quan trọng khi các bạn muốn làm một số chức năng như cache hay log file nhằm giúp ứng dụng web chạy nhanh hơn,… Show
Các hàm xử lý và làm việc với file trong PHP Việc nắm vững kiến thức về xử lý file và quyền hạn của file, thư mục khi học PHP không những giúp bạn dễ dàng lưu trữ thông tin cho website mà còn giúp bạn tăng tính bảo mật cho các file và thư mục quan trọng. Quá trình làm việc với một file trong PHP diễn ra như sau: Mở file –> Thao tác (Đọc, Ghi ) –> Đóng file. Các loại File được hỗ trợ trong PHP
Mở file với fopenĐể mở file trong PHP chúng ta dùng hàm fopen với cú pháp: fopen($path, $mode); Trong đó:
Danh sách ký hiệu thuộc tính $mode gồm quyền hạn truy cập vào file. ModeChú thíchrChỉ được đọc (Read only)r+Được quyền đọc và ghi (Read + write)wChỉ được viết (write only)xTạo file mới chỉ để ghi.w+Được quyền đọc và viết (write + read). Nếu file này tồn tại thì nội dung cũ sẽ bị xóa đi và ghi lại nội dung mới, còn nếu file chưa tồn tại thì nó tạo file mới.aĐược quyền chỉ để viết và nếu file đã tồn tại nó sẽ ghi tiếp nội dung phía dưới, ngược lại nếu file không tồn tại nó tạo file mới.a+Được quyền cả viết lẫn đọc. Nếu file tồn tại nó sẽ ghi tiếp nội dung phía dưới, ngược lại nếu file không tồn tại nó tạo file mớix+Quyền tạo file mới để đọc và ghi.bMở dưới dạng chế độ binaryHàm fopen() sẽ mở một file dựa vào đường dẫn truyền vào. Nếu truyền vào một URL, hàm sẽ sẽ tìm kiếm một trình xử lý giao thức(wrapper) cho URL đó, nếu không có trính xử lý nào đươc cung cấp, nó sẽ cảnh báo cho người dùng và sau đó tiếp tục như đối với các file bình thường. Ví dụ: <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?> Đọc File trong PHPCó 3 cách đọc file thông thường trong PHP đó là đọc từng dòng, đọc từng ký tự và đọc hết file. Chúng ta sẽ đi vào từng cách đọc trên nhé! Sử dụng hàm feof trong đọc fileTrước khi tìm hiểu các cách đọc file trong PHP mình xin giới thiệu các bạn hàm feof(). Hàm này có tác dụng đặt trong vòng lặp để sau khi đọc xong nó sẽ chuyển sang dòng mới hoặc ký tự mới đối với từng trường hợp đọc file. Hàm feof() hữu ích khi lặp lại những dữ liệu không xác định được độ dài. Đọc file từng dòngĐể đọc file từng dòng ta dùng hàm fgets($fp). Ở cách này trước tiên chúng ta sẽ dùng feof để sau khi đọc xong nó sẽ chuyển sang dòng mới, và dùng hàm fgets để in ra từng dùng của file. <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?> Ở phương pháp đọc file theo từng dòng này, ngoài cách duyệt từng dòng bằng việc dùng hàm feof trong vòng lặp while như trên thì ta còn có một cách khác đó là chuyển file sang dạng mảng với mỗi phần tử trong mảng là 1 dòng của file, sau đó chỉ cần duyệt mảng và xuất ra màn hình. $array = @file('demo.txt'); // chuyển đổi file sang mảng foreach ($array as $value) { echo $value; } Trong đó: Hàm <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>7 đọc nội dung của file và đưa vào một mảng. Mỗi phần tử của mảng tương ứng với một dòng của file. Đọc file từng ký tựĐể đọc file từng dòng ta dùng hàm fgetc($fp). Ở cách này trước tiên chúng ta sẽ dùng feof để sau khi đọc xong nó sẽ chuyển sang dòng mới, và dùng hàm fgetc để in ra từng dùng của file. <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng ký tự để đọc while(!feof($fp)) { echo fgetc($fp); } } ?> Đọc hết file với freadThông số trong hàm fread() chứa tên của file dùng để đọc dữ liệu và thông số thứ hai là một số lượng bytes nhất định để đọc dữ liệu. Cú pháp: fread($file,$filesize) <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; echo fread($file, filesize('demo.txt')); } ?> Ghi, Chèn dữ liệu vào file trong PHPĐể ghi nội dung vào file ta dùng hàm fwrite($fp, $content) trong đó $fp là đối tượng trả về lúc mở file, còn $content Để ghi file thì bắt buộc file của bạn phải được mở ở chế độ mode có cho phép ghi file và tiếp đó dùng hàm Vì vậy mà việc ghi file sẽ phụ thuộc vào lúc bạn mở file như thế nào. Ví dụ lúc bạn mở file ghi đè thì lúc ghi file nó sẽ ghi đè, lúc bạn mở file ghi kiểu append thì lúc ghi file nó sẽ thêm xuống cuối file, nếu bạn mở file chỉ cho đọc thì bạn không thể ghi file được. <?php $fp = @fopen('demo.txt', "w"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; fwrite($fp,'Đã mở file thành công, hãy tiếp tục thao tác mới'); } ?> Đóng FileQuá trình làm việc với một file trong PHP diễn ra như sau: Mở file –> Thao tác (Đọc, Ghi ) –> Đóng file. Quy trình này là mặc định đối với nhiều ngôn ngữ lập trình khác nhau, chúng ta luôn phải tuân thủ theo quy trình đã mở thì phải đóng. Việc mở file để sử dụng mà không đóng file rất nguy hiểm, vì thế sau khi sử dụng xong bạn nên đóng file để an toàn hơn và thu hồi tài nguyên hệ thống. Để đóng file ta dùng hàm fclose($fp). Trong đó $fp là đối tượng trả về lúc bạn mở file. <?php $fp = @fopen('demo.txt', "w"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; fwrite($fp,'Đã mở file thành công, hãy tiếp tục thao tác mới'); fclose($fs); //đóng file } ?> Vì thế những ví dụ ở phần đọc file bạn đều phải bổ sung thêm hàm đóng file vào thì code mới đúng và hoàn chỉnh các bạn nhé! Các hàm xử lí file khácKiểm tra file có tồn tại không?Trong PHP có cung xấp cho chúng ta hàm <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>0 nếu file tồn tại và ngược lại <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>1 nếu không. Trong đó $path là đường dẫn đến file cần test. Bạn cũng có thể sử dụng hàm này khi bạn tạo ra một tập tin mới và bạn muốn đảm bảo rằng các tập tin chưa từng tồn tại trên server. <?php if (file_exists('STDIO.txt')) { echo 'File exists'; } ?> Kiểm tra cấp quyền với fileĐể kiểm tra file có được cấp quyền gì không thì chúng ta dùng hàm <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>2 . Hàm này sẽ trả về true nếu được quyền ghi và ngược lại false nếu không được quyền ghi. <?php $fp = @fopen('demo.txt', "w"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { if(is_writable('demo.txt')){ fwrite($fp, 'Được phép ghi');} else{ echo 'Không Được phép ghi';} fclose($fp); } Lấy nội dung của file hàm file_get_contentsCú pháp: file_get_contents($path) Trong đó $path là đường dẫn đến file, hoặc 1 đường link URL dẫn tới trang web chứa file. <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>0 Đổi tên fileĐể đổi tên file ta dùng hàm <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>3, trong đó <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>4 là đường dẫn đến file cần đổi tên, <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>5 là đường dẫn mới có kèm tên file cần đổi . Nếu bạn chỉ muốn đổi tên thôi thì đường dẫn của cả 2 biến giống nhau, chỉ khác nhau ở cái tên file. Nếu tên file mới bị trùng thì file đó sẽ bị ghi đè. <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>1 Copy fileCú pháp: <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>6 Trong đó <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>7 là path file cần copy và <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>8là path file cần di chuyển tới. <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>2 Xóa fileTa dùng hàm <?php $fp = @fopen('demo.txt', "r"); // Kiểm tra file mở thành công không if (!$fp) { echo 'Mở file không thành công'; } else { echo 'Mở file thành công <br>'; // Lặp qua từng dòng để đọc while(!feof($fp)) { echo fgets($fp); } } ?>9 để xóa file. Trong đó $array = @file('demo.txt'); // chuyển đổi file sang mảng foreach ($array as $value) { echo $value; }0 là đường dẫn đến file cần xóa. <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>3 Ghi toàn bộ nội dung chuỗi ra fileĐây là cách ghi toàn bộ một chuỗi ra file ngắn gọn (thay cho việc phải sử dụng fopen, fread, fclose). Cú pháp: file_put_contents($path, $contents) <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>4 Tạo một thư mục ( folder) mớiCú pháp: mkdir($path) Trong đó $path là đường dẫn đến folder cần tạo. Ví dụ: <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>5 Lưu ý: tên folder cuối cùng lằn trong link chính là tên folder bạn cần tạo và tất cả các folder trước nó bạn chắc chắn là phải có, nếu không sẽ bị lỗi. Từ ví dụ trên ta sẽ nhận ra rằng ta đã phải có folder webdevelopment và trong nó là folder con có tên là php thì mới tạo thêm được. Kiểm tra sự tồn tại đường dẫn thư mụcCú pháp kiểm tra sự tồn tại của thư mục trong php là is_dir(path) <?php $open = @fopen('data.txt', 'r'); // dùng @ đặt trước hàm fopen để ngăn chặn thông báo lỗi khi truyền sai đường dẫn file if (!$open) echo "Mở file không thành công"; else echo "Mở file thành công"; ?>6 Kết thúcQua bài viết trên mình đã nói qua về những hàm cần thiết về xử lý file cần biết trong PHP, Các bạn hãy thao khảo tìm mốt số bài tập thực hành để nâng cao hiểu biết của bản thân hơn nhé! Ngoài ra còn rất nhiều hàm xử lý về file khác mà mình chưa nói tới, các bạn có thể tham khảo tại đây. Bài viết tiếp theo mình sẽ sơ lược qua về vấn đề xử lý thời gian, ngày tháng trong PHP các bạn hãy đón đọc nhé!
|