PHP'de Dosya ve Dizin İşlemleri

PHP ile bir proje geliştirirken ya da bir proje üzerinde çalışırken farklı sebep ve ihtiyaçlardan dolayı dosya ve dizinler üzerinde işlemler yapmanız gerekebilir. Bu durumda PHP'nin dosya ve dizin yönetimi için kullanılan işlev ve yöntemleri bilmeniz gerekiyor.

Dosya ve dizin işlemleri nelerdir?

Herhangi bir dosyayı PHP dosyasının içerisine dahil etmek, dosyaların konumunu, içeriğini ve adını değiştirmek, dosya ve dizinleri oluşturup silmek bu işlemlerin başında geliyor.

PHP'de Bir Dosyayı Dahil Etme

PHP'de dosya dahil etme işlemi genellikle farklı bir PHP dosyasını dahil etmek için kullanılır. Böylece yüzlerce farklı PHP dosyasını tek bir dosyaya dahil ederek, hepsini sanki tek dosyaymış gibi çalıştırmak mümkün hale geliyor. Buna ne gerek var diye düşünebilirsiniz. Bu büyük projeleri kolay ve zahmetsiz bir şekilde küçük parçalara ayırabilmemizi ve yönetebilmemizi sağlıyor.

PHP'de dosya dahil etme işlemi için kullanılan 4 farklı işlev vardır. Bunlar include(), include_once(), require(), require_once() işlevleridir.

Bu dört işlev temelde aynı amaç için yani bir dosyayı dahil etmek için kullanılır ancak aralarında yapısal farklılık vardır.

Bu fonksiyonların hepsi parametre olarak dahil edilmek istenen dosyanın tam dosya yolunu yani path bilgisini alır.

include()

Bir dosyayı dahil etmek için kullanılır.

Bu işlev dahil edilmek istenilen dosyanın kendisinden önce dahil edilip edilmediğini kontrol etmez.
Herhangi bir hata oluşacak olursa sonrasındaki kodlar okunmaya/çalışmaya devam eder.

// Aynı dizin içindeki dosya için
include("dosyaadi.php");

// Farklı bir dizindeki dosya için
include("/tam/dosya/yolu/dosyaadi.php");

// Parantez kullanmadan da kullanılabilir
include "dosyaadi.php";

include_once()

Bir dosyayı dahil etmek için kullanılır.

Bu işlev dahil edilmek istenen dosyanın kendisinden önce dahil edilip edilmediğini kontrol eder.
Herhangi bir hata oluşacak olursa sonrasındaki kodlar okunmaya/çalışmaya devam eder.

// Aynı dizin içindeki dosya için
include_once("dosyaadi.php");

// Farklı bir dizindeki dosya için
include_once("/tam/dosya/yolu/dosyaadi.php");

// Parantez kullanmadan da kullanılabilir
include_once "dosyaadi.php";

require()

Bir dosyayı dahil etmek için kullanılır.

Bu işlev dahil edilmek istenilen dosyanın kendisinden önce dahil edilip edilmediğini kontrol etmez.
Herhangi bir hata oluşursa kodlar okunmaya/çalışmaya devam etmez.

// Aynı dizin içindeki dosya için
require("dosyaadi.php");

// Farklı bir dizindeki dosya için
require("/tam/dosya/yolu/dosyaadi.php");

// Parantez kullanmadan da kullanılabilir
require "dosyaadi.php";

require_once()

Bir dosyayı dahil etmek için kullanılır.

Bu işlev dahil edilmek istenilen dosyanın kendisinden önce dahil edilip edilmediğini kontrol eder.
Herhangi bir hata oluşursa kodlar okunmaya/çalışmaya devam etmez.

// Aynı dizin içindeki dosya için
require_once("dosyaadi.php");

// Farklı bir dizindeki dosya için
require_once("/tam/dosya/yolu/dosyaadi.php");

// Parantez kullanmadan da kullanılabilir
require_once "dosyaadi.php";

Dosya ve Dizin Fonksiyonları

PHP'de dosya ve dizinler üzerinde işlemler yapmaya başlamadan önce bilmemiz gereken bazı işlevler var.

basename()

Belirtilen dosya yolundan dosya adı bölümünü döndürür.

echo basename("/dosya/yolu/dosyaadi.php");
// Output : "dosyaadi.php"

Eğer ikinci parametre olarak dosya uzantısı verilirse sadece dosya adını uzantı olmadan döndürür.

echo basename("/dosya/yolu/dosyaadi.php", ".php");
// Output : "dosyaadi"

echo basename("/dosya/yolu/resim.jpg", ".jpg");
// Output : "resim"

dirname()

Bir dosya ya da dizinin bulunduğu dizin (klasör) yolunu verir.

İkinci parametre olarak kaç üst dizinin yol bilgisinin döndürmesini istediğini belirtebilirsiniz.

echo dirname("/dosya/yolu/dosya.txt");
// Output : "/dosya/yolu"

echo dirname("/dosya/tam/yolu/");
// Output : "/dosya/tam"

echo dirname("/dosya/tam/yolu/dosyaadi", 2);
// Output : "/dosya/tam"

pathinfo()

Bir dosyanın dosya yolu ve adını içeren bilgileri bir dizi olarak döndürür.

$info = pathinfo("/dosya/tam/yolu/dosyaadi.txt");

echo $info['dirname'];
// Output : "/dosya/tam/yolu"

echo $info['basename'];
// Output : "dosyaadi.txt"

echo $info['extension'];
// Output : "txt"

echo $info['filename'];
// Output : "dosyaadi"

Bir dizi olarak tüm bilgilerin değil de tek birisinin dize (string) olarak dönmesini isterseniz ikinci parametre olarak aşağıdaki seçenekleri kullanarak bunu sağlayabilirsiniz.

PATHINFO_DIRNAME : Dosyanın dizin yolunu verir.
PATHINFO_BASENAME : Dosya adını uzantısıyla birlikte verir.
PATHINFO_EXTENSION : Dosyanın uzantısını verir.
PATHINFO_FILENAME : Dosyanın uzantısız adını verir.

Yukarıdaki seçeneklerin kullanımı için aşağıdaki örneği inceleyebilirsiniz.

echo pathinfo("/dosya/tam/yolu/dosyaadi.txt", PATHINFO_DIRNAME);
// Output : "/dosya/tam/yolu"

echo pathinfo("/dosya/tam/yolu/dosyaadi.txt", PATHINFO_BASENAME);
// Output : "dosyaadi.txt"

echo pathinfo("/dosya/tam/yolu/dosyaadi.txt", PATHINFO_EXTENSION);
// Output : "txt"

echo pathinfo("/dosya/tam/yolu/dosyaadi.txt", PATHINFO_FILENAME);
// Output : "dosyaadi"

realpath()

Belirtilen değer doğrultusunda kaynağın mutlak yolunu bulur ve döndürür.

/**
* "." verilirse dosyanın çalıştı
* dizinin yolunu döndürür.
*/
echo realpath(".");
// Output : "/home/safak/www"

Bu işlev /./, /../ gibi yazımları çözümleyerek mutlak dosya yolunu bulmak için kullanılır.

Not : Bu fonksiyon sanal dosya ve dizinler ile çalışamaz. Yani belirtilen dosya ve dizin gerçekten bulunmak zorundadır. Olmayan ya da sanal bir yol verilirse; false döndürür.

Bu işlev bir Windows cihaz üzerinde çalıştırılıyor ise Unix dizin yazımını Windows versiyonuna çevirir.

echo realpath("/");
// Output : "C:\"

echo realpath("/windows/system32/");
// Output : "C:\Windows\System32"

filetype()

Belirtilen kaynağın bir dosya mı yoksa bir dizin mi olduğunu bularak bu bilgiyi geriye döndürür.

echo filetype("/home/safak/www/dosya.txt");
// Output : "file"

echo filetype("/home/safak/www/");
// Output : "dir"

fileowner()

Belirtilen kaynağın dosya sahibinin ID kimlik bilgisini döndürür.

$kimin = fileowner("index.php");
echo "Bu dosya " . $kimin . " ID'li kullanıcınındır.";

Bu işlev bir tam sayı döndürür. "0" bilgisayarlarda root, admin ya da süperuser'ı temsil eder.

filegroup()

Belirtilen kaynağın dosya sahibi grubunun ID kimlik bilgisini döndürür.

$kimlerin = filegroup("index.php");
echo "Bu dosya " . $kimlerin . " ID'li kullanıcı grubuna aittir.";

Bu işlev bir tam sayı döndürür. "0" bilgisayarın root kullanıcı grubunu ifade eder.

fileinode()

Belirtilen kaynağın dosya düğüm numarasını döndürür.

echo fileinode("dosya.txt"); // Output : 0

Bu işlev bir tam sayı döndürür. Dosyanın bir düğümü yoksa; "0" dönecektir.

fileperms()

Belirtilen kaynağın dosya erişim izinin döndürür.

echo fileperms("index.php");
// Output : 33206

Bu işlev dosya izinlerini sayısal kip olarak döndürür. Bu işlevin döndürdüğü sayısal kip tek başına anlaşılamaya bilir. İzinler için daha sık kullanılan ve daha anlaşılabilir olan versiyonunda değeri almak için aşağıdaki gibi bir kullanım yapılabilir;

echo substr(sprintf('%o', fileperms("index.php")), -4);
// Output : 0666

filesize()

Belirtilen kaynağın dosya boyutunu byte cinsinden döndürür.

$size_byte = filesize("dosya.txt");

echo "Bu dosya " . $size_byte . " bayttır.";

filectime()

Belirtilen dosyanın oluşturma zamanının Unix zaman damgasını döndürür.

$ctime = filectime("dosya.txt");

echo "Bu dosya " . date("d/m/Y H:i:s", $ctime) . " tarihinde oluşturulmuştur.";

filemtime()

Belirtilen dosyanın son değiştirilme zamanını Unix zaman damgası olarak döndürür.

$mtime = filemtime("dosya.txt");

echo "Bu dosya en son " . date("d/m/Y H:i:s", $mtime) . " tarihinde güncellenmeştir.";

fileatime()

Belirtilen dosyanın son erişim zamanını Unix zaman damgası olarak döndürür.

$atime = fileatime("dosya.txt");

echo "Bu dosyaya en son " . date("d/m/Y H:i:s", $atime) . " tarihinde erişim sağlanmıştır.";

getcwd()

Geçerli çalışma dizini bilgisini döndürür.

echo getcwd();
// Output : C:\xampp\htdocs

chdir()

Geçerli (çalışan betiğin) çalışma dizinini değiştirir.

echo getcwd(); // C:\xampp\htdocs

chdir("includes/");

echo getcwd(); // C:\xampp\htdocs\includes

Not : Bu sık kullanılan bir yöntem değildir ve kullanılması da genelde tercih edilmez. Yine de bazı durumlarda gerekli olabiliyor.

Dikkat : Geçerli çalışma betiği değiştirildiğinde, dahil etme işlevleri de dahil dizin ve dosya işlemlerinde kullandığınız tüm işlevler için değiştirilmiş olur.

Sınama İşlevleri

PHP'de dosya ve dizin işlemleri sırasında sıklıkla kullanılabilecek sınama işlevleri vardır.

file_exists()

Belirtilen dosya veya dizinin var olup olmadığını sınar. Varsa true, yoksa false döndürür.

if(file_exists("dosya.txt")){
echo "dosya.txt var.";
}else{
echo "dosya.txt bulunamadı.";
}

is_dir()

Belirtilen yolun bir dizin olup olmadığını sınar. Dizin ise true, değilse false döndürür.

if(is_dir("/home/safak/www/")){
echo "Bir dizindir";
}else{
echo "Bir dizin değildir.";
}

is_file()

Belirtilen yolun bir dosya olup olmadığını sınar. Dosya ise true, değilse false döndürür.

if(is_file("/home/safak/www/dosya.txt")){
echo "Bir dosyadır";
}else{
echo "Bir dosya değildir.";
}

is_link()

Belirtilen yolun bir link/kısayol olup olmadığını sınar. Kısayol ise true, değilse false döndürür.

if(is_link("/home/safak/www/public")){
echo "Bir kısayoldur";
}else{
echo "Bir kısayol/link değildir.";
}

is_executable()

Belirtilen yolun çalıştırılabilir bir dosya olup olmadığını sınar. Çalıştırılabilir bir dosya ise true, değilse false döndürür.

if(is_executable("somefile.sh")){
echo "Çalıştırılabilir bir dosyadır.";
}else{
echo "Bu dosya çalıştırılamaz.";
}

Çalıştırılabilir ifadesinden kasıt çift tıklama ile çalışmaya başlayan bir dosya olup olmadığıdır. Örneğin; Windows cihazlarda ".exe" dosyaları çalıştırılabilir dosyalardır.

is_readable()

Belirtilen dosyanın varlığını ve okunabilirliğini sınar.
Dosya varsa ve okunabilirse true, aksi halde false döndürür.

if(is_readable("dosya.txt")){
echo "Bu dosya okunabilir.";
}else{
echo "Bu dosya okunamaz.";
}

is_writable()

Belirtilen dosya ya da dizinin varlığını ve yazılabilir olup olmadığını sınar. Dosya ya da dizin varsa ve yazılabilirse true, aksi halde false döndürür.

if(is_writable("dosya.txt")){
echo "Bu dosya yazılabilir.";
}else{
echo "Bu dosya yazılamaz.";
}

Not : Bazı yazılımcılar is_writeable() işlevini kullanabilir. Bu yazım hatası değildir. is_writable() işlevinin takma adıdır.

Dizin Oluşturma ve Silme

PHP'de bir dizin (klasör) oluşturma işlemi mkdir() ve dizin silme işlemi rmdir() fonksiyonları ile yapılmaktadır.

mkdir()

Belirtilen dizini oluşturmayı dener.

Dizin oluşturulma işlemi başarılı olursa true, başarısız olursa false döndürür.

/**
* Betiğin bulunduğu dizin altında
* bir dizin oluşturmayı dener.
*/
mkdir("yenidizin");

/**
* Farklı bir dizin içinde
* bir dizin oluşturmayı dener.
*/
mkdir("/home/safak/yenidizin");

Bu işleve ikinci parametre olarak oluşturulacak dizinin izinlerini de belirtebilirsiniz. İkinci parametre belirtilmezse varsayılan 0777'dir.

mkdir("yenidizin", 755);

rmdir()

Belirtilen dizini silmeyi dener.

Silme işlemi başarılı olursa true, başarısız olursa false döndürür.

rmdir("dizinadi");

Dizin'in Alt Dizin ve Dosyaları

PHP'de bir dizin içerisindeki dosya ve alt dizinleri görebilmeniz için iki işlev vardır. Bunlar glob() ve scandir() işlevleridir.

scandir()

Belirtilen dizin içerisindeki tüm alt dizin ve dosya isimlerinden yeni bir dizi oluşturarak bu diziyi döndürür.

$scan = scandir("/home/safak/dizin");
print_r($scan);

yukarıdaki örnek şuna benzer bir çıktı üretir;

Array(
[0] => .
[1] => ..
[2] => dizin1
[3] => dizin2
[4] => dizin3
[5] => dosya1.txt
[6] => dosya2.txt
)

gördüğünüz gibi belirttiğim dizin içerisinde yer alan alt dizin ve dosyalar bir dizi olarak döndü. Dönen dizinin alfabetik sıraya göre sıralandığına dikkat edin. Ayrıca dönen dizinin ilk iki elemanı . ve .. şeklinde olacaktır. . mevcut dizini, .. ise bir üst dizini temsil etmektedir.

Bu işleve ikinci parametre olarak 1 verilirse sıralamayı tersine çevirecektir. İkinci parametre belirtilmezse varsayılan olarak 0'dır.

glob()

Belirtilen dizin içerisinde belirtilen kalıba uygun alt dizin ve dosya isimlerinden yeni bir dizi oluşturarak bu diziyi döndürür.

Bu işlevde ikinci parametre olarak kullanabileceğiniz bazı öntanımlı seçenekler var. Bu seçenekleri aşağıda görebilirsiniz.

GLOB_MARK : Dönen her dizine bir eğik çizgi (/) ekler. Windows cihazlarda ters eğik çizgi (\) ekleyecektir.
GLOB_NOSORT : Dosyaları alfabetik olarak sıralamaz.
GLOB_NOCHECK : Hiçbir eşleşme bulamazsa arama kalıbını döndürür.
GLOB_NOESCAPE : Ters eğik çizgiler denetim karakterlerini öncelemez.
GLOB_BRACE : Geliştirilmiş kalıplar ile eşleştirme yapar.
GLOB_ONLYDIR : Sadece kalıpla eşleşen dizinleri döndürür.
GLOB_ERR : Okuma hatalarında işlemi durdurur. Öntanımlı olarak hatalar yoksayılır.

$pattern = "/home/*";

$glob = glob($pattern);
print_r($glob);

yukarıdaki örnek aşağıdakine benzer bir çıktı üretir;

Array(
[0] => Adizini
[1] => Adosyasi.txt
[2] => Bdizini
[3] => Bdosyasi.txt
[4] => Cdizini
)

İkinci parametre olarak bir seçenek ile kullanımı ise aşağıdaki gibidir.

$pattern = "/home/*";
$glob = glob($pattern, GLOB_MARK);
print_r($glob);

yukarıdaki örneğin çıktısı aşağıdakine benzer olacaktır;

Array(
[0] => /home/Adizini/
[1] => /home/Adosyasi.txt
[2] => /home/Bdizini/
[3] => /home/Bdosyasi.txt
[4] => /home/Cdizini/
)

Bir de kullandığımız kalıbı değiştirelim ve örneğin sadece .txt uzantılı dosyaları istediğimizi söyleyim.

$pattern = "/home/*.txt";

$glob = glob($pattern);
print_r($glob);

yukarıdaki örnekte /home/ dizininde .txt uzantılı dosyaları istediğimizi söyledik ve çıktısı aşağıdakine benzer olacaktır.

Array(
[0] => Adosyasi.txt
[1] => Bdosyasi.txt
)

Hem .txt hem de .php uzantılı dosyaları almak isteseydim aşağıdaki gibi bir kalıp kullanmak işimi görürdü.

$pattern = "/home/*.{txt,php}";

$glob = glob($pattern, GLOB_BRACE);
print_r($glob);

Kalıp örnekleri çoğaltılabilir. Örneğin; A ile başlayan dosyaları listelemek için A* şeklinde bir kalıp yazılabilir. Ya da abc ile başlayan .doc uzantılı dosyaları istiyorsanız abc*.doc şeklinde bir kalıp yazılır.

Dizin Okuma İşlemleri

PHP'de dizin okuma işlemlerinde kullandığımız 3 ana işlev vardır. Bu 3 işlev birlikte kullanılır. Öncelikle bu 3 işlevden kısaca bahsedeyim ve sonrasında örneklendireyim.

opendir() : İşlem yapılacak dizini bellek üzerinde açar.
readdir() : Açılan dizini okur.
closedir() : Açılmış olan dizini kapatarak belleği boşaltır.

$dizin_ac = opendir("./");
while($oku = readdir($dizin_ac)){
echo $oku.PHP_EOL;
}
closedir($dizin_ac);

Bu işlevler bellek üzerinde kaynak (resource) veri türü ile çalışır.

Dosya İşlemleri

PHP'de dosyaları açmak, okumak ve yazmak için özel işlevler ve işlevlerin özel kullanımları vardır.

Dosya Oluşturma, Silme, Kopyalama ve Taşıma

PHP'de dosya oluşturma işlemi touch(), dosya silme işlemi unlink(), dosya kopyalama işlemi copy(), taşıma işlemi ise rename() işlevi ile yapılır.

touch()

Belirtilen dosyanın son erişim ve değişiklik zamanını değiştirir. Dosya yoksa oluşturur. Bu yüzden dosya oluşturma işlemlerinde de kullanılır.

touch("dosya.txt");

İkinci parametre olarak Unix zaman damgası alır. Belirtilmezse time() işlevi ile çalışma zamanının Unix zaman damgası kullanılır.

link()

Belirtilen hedef için belirtilen isimde bir kısayol/link oluşturur.
İlk parametre hedef, ikinci parametre ise kısayol adıdır.

link("/home/safak/www/", "Projeler");

unlink()

Belirtilen dosyayı silmek için kullanılır.
Silme işlemi başarılı olursa true, başarısız olursa false döndürür. Ayrıca başarısız olursa E_WARNING seviyesinde bir hata fırlatır.

unlink("dosyaadi.txt");

copy()

Belirtilen dosyayı farklı bir isimle ya da farklı bir dizine kopyalamak için kullanılır.
Kopyalama işlemi başarılı olursa true, başarısız olursa false döndürür.

İki parametre ile çalışır;
1. Kaynak : Kopyalanacak dosyanın yolu,
2. Hedef : Kopyalamanın yapılacağı yol,

Dikkat : Hedef konumunda aynı isimde bir dosya varsa üzerine yazılır.

copy("dosya.txt", "dosya-kopyasi.txt");

rename()

Belirtilen dosyanın ismini değiştirmek ya da farklı bir dizine taşımak için kullanılır.
İşlem başarılı olursa true, başarısız olursa false döndürür.

İki parametre ile çalışır;
1. Eski İsim : İşlemin yapılacağı tam dosya yolu
2. Yeni İsim : İşlem sonrasındaki tam dosya yolu

rename("eski-dosya.txt", "yeni-dosya.txt");

Dosya Açma ve Kapatma

fopen()

Bir dosya ya da url'i belirtilecek kipte bellek üzerinde (resource) açar.

fopen() işlevi ile kullanılabilecek kipleri ve ne için kullanıldıklarını aşağıdaki tabloda görebilirsiniz.

Kip | Açıklama

r

Dosya sadece okumak için açılır.
İmleç dosyanın başlangıcına yerleştirilir.

r+

Dosya hem okumak hem de yazmak için açılır.
İmleç dosyanın başlangıcına yerleştirilir.

w

Dosya sadece yazmak için açılır.
Dosya içeriği boşaltılır/silinir.
İmleç dosyanın başlangıcına yerleştirilir.

w+

Dosya hem okumak hem de yazmak için açılır.
Dosya içeriği boşaltılır/silinir.
İmleç dosyanın başlangıcına yerleştirilir.

a

Dosya sadece yazmak için açılır. (Dosya yoksa oluşturulur)
İmleç dosyanın sonuna yerleştirilir.

a+

Dosya hem yazmak hem de okumak için açılır. (Dosya yoksa oluşturulur)
İmleç dosyanın sonuna yerleştirilir.

x

Dosya oluşturulur ve sadece yazmak için açılır. (Dosya zaten mevcutsa fopen() işlevi false döndürerek başarısız olur.)
İmleç dosyanın başlangıcına yerleştirilir.

x+

Dosya oluşturulur ve hem okumak hem de yazmak için açılır. (Dosya zaten mevcutsa fopen() işlevi false döndürerek başarısız olur.)
İmleç dosyanın başlangıcına yerleştirilir.

Yukarıdaki tablodaki kipler dosyanın hangi amaçla ve ne şekilde açılacağını belirlemek için fopen() işlevine ikinci parametre olarak verilir.

Dikkat : Buradan sonraki anlatımlarda ve bu işlevi kendiniz kullandığınızda fopen() işlevi dosyayı hangi kip ile açmış buna çok dikkat edin. Veri kaybı gibi telafisi mümkün olmayan hatalara sebep olabilirsiniz.

fopen() işlevi başarılı olursa true, başarısız olursa false döndürür. Ayrıca bu işlev dosyayı açma işlemi sırasında bir hata oluşursa E_WARNING türünde bir hata fırlatacaktır.

fclose()

fopen() tarafından açılan dosyayı kapatarak belleği boşaltır.

$file = fopen("dosya.txt", "r");

if($file){
echo "Dosya açıldı.";
}else{
echo "Dosya açılamadı!";
}

fclose($file);

Dosya Okuma

PHP'de bir dosyanın içeriğini okumak için farklı şekillerde okuma yapmayı sağlayan farklı işlevler vardır.

feof()

fopen() ile açılan dosyada konumlandırıcı (imleç) dosyanın sonunda mı diye sınar. Bu işlev okuma işlevleri ile dosyanın tamamının eksiksiz okunup okunmadığını kontrol etmek için kullanılır.

Bu işlevin örnek bir kullanım senaryosunu aşağıdaki fgets(), fgetc() işlevlerinin örneklerinde görebilirsiniz.

fgets()

fopen() ile açılan dosya içeriğini satır satır okumak için kullanılır.
Bu işlev tek başına kullanılırsa sadece dosyanın ilk satırını okuyacaktır. Bu yüzden bir döngü yardımıyla dosyanın tümünü satır satır okuması sağlanabilir.

$path = "dosya.txt";
$file = fopen($path, "r");
if($file){
while($gets = fgets($file)){
echo $gets;
}
}
fclose($file);

Not : İsteğe bağlı ikinci parametre olarak kaç baytlık okuma yapılacağı belirtilebilir. Örneğin; 60 olarak tanımlanırsa okuma işlemi 60 baytlık yapılır.

feof() işlevi kullanılarak dosya sonuna kadar okuma yapmak yine benzer şekilde mümkündür.

$path = "dosya.txt";
$file = fopen($path, "r");
if($file){
while(!feof($file)){
$gets = fgets($file);
echo $gets;
}
}
fclose($file);

fgetc()

fopen() ile açılan dosya içeriğini karakter karakter okumak için kullanılır.
Bu işlev tek başına kullanılırsa sadece ilk karakteri okuyacaktır. Bu yüzden bir döngü yardımıyla dosyanın tümünü karakter karakter okuması sağlanabilir.

$path = "dosya.txt";
$file = fopen($path, "r");
if($file){
while($getc = fgetc($file)){
echo $getc;
}
}
fclose($file);

feof() işlevi kullanarak da yine dosya sonuna kadar okuma işleminin sürdürülmesini sağlamak mümkündür.

$path = "dosya.txt";
$file = fopen($path, "r");
if($file){
while(!feof($file)){
$getc = fgetc($file);
echo $getc;
}
}
fclose($file);

fread()

fopen() ile açılan dosyayı ikili kipte belirtilecek uzunlukta (bayt cinsinden) okumak için kullanılır.

$file = fopen("dosya.txt", "r");
if($file){
$read = fread($file, 4096);
echo $read;
}
fclose($file);

Yukarıdaki örnekte açtığımız dosyada 4096 bayt yani 4Kb'lık bölümü okumak istediğimizi belirttik.

Not : Bu doğru bir kullanım değildir. Sadece anlatım için bu şekilde kullandım.

fread() işlevi dosya boyutu belirtilen boyuttan küçükse dosya içeriği bittiğinde, belirtilen boyuttan büyükse bu limite ulaşıldığında okuma işlemini sonlandıracaktır.

Dosyanın tamamını okumak istiyorsak buraya dosyanın bayt cinsinden boyutunu vermeliyiz. Bu veriye de filesize() işlevi ile öğrenebiliriz. Yani ideal kullanım şu şekilde olacaktır.

$path = "dosya.txt";
$file = fopen($path, "r");
if($file){
$read = fread($file, filesize($path));
echo $read;
}
fclose($file);

fpassthru()

fopen() ile açılmış olan dosya içeriğinin tamamını çıktılar ve dosyanın bayt cinsinden boyutunu döndürür.

$path = "dosya.txt";
$file = fopen($path, "r");
if($file){
$icerik = fpassthru($file);
echo "Dosyanın boyutu : " . $icerik . " bayt";
}
fclose($file);

file()

Belirtilen dosya ya da URL'i satır satır okumak için kullanılır. Bu işlev bir ilgili dosya içeriğini her satır bir eleman olacak şekilde bir dizi halinde döndürür.

$file = file("dosya.txt");
foreach($file as $line => $text){
echo $line . ". satır içeriği : " . $text;
}

readfile()

Belirtilen dosya ya da URL içeriğinin tamamını okumak için kullanılır. Bu işlev okuduğu dosya içeriğini doğrudan çıktılar/yazdırır ve dosyanın bayt cinsinden boyutunu döndürür.

readfile("dosya.txt");

Not : Bu işlev dahil etme işlevlerine benzer şekilde çalışıyor gibi görünse de dahil etme işlemi değil bulunduğu konuma ilgili dosya içeriğini çıktılama işlemi yapar.

Not : Bu işlev genellikle bir dosyaya indirtme yaptırılacağı zaman kullanılır. Örneğin aşağıdaki betik belirtilen dosya için otomatik bir indirme işlemi başlatmayı amaçlar.

$filePath = "/dosya/yolu/resim.jpg";

if(file_exists($filePath)){
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($filePath).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($filePath));
readfile($filePath);
exit;
}

file_get_contents()

Belirtilecek dosya ya da URL içeriğini döndürür.

Bu işlev dosya okuma işlemlerinde yazılımcıların en sık kullandığı yöntemdir. Kullanımı oldukça kolay ve basittir.

$content = file_get_contents("dosya.txt");
echo $content;

Dosya Konumlandırıcı (İmleç) Belirteci

PHP, yukarıda dosya açma ve dosya okuma işlemleri sırasında bahsettiğim konumlandırıcının (imlecin) konumunu belirlemenizi sağlayan işlevlere sahiptir. Bu işlevleri kullanarak imlecin konumunu dosya başlangıcı ya da dosya sonundan farklı bir konuma taşıyabilirsiniz.

ftell()

fopen() işlevi ile açılmış bir dosya içerisinde konumlandırıcının (imlecin) mevcut konumunu döndürür.

$path = "dosya.txt";
$file = fopen($path, "r");
if($file){
$birazOku = fgets($file, 12);

$neredeyim = ftell($file); // 11
echo "Konumlandırıcının mevcut konumu : " . $neredeyim;
}
fclose($file);

fseek()

fopen() işlevi ile açılmış bir dosyada konumlandırıcının (imlecin) konumunu değiştirmek ya da belirlemek için kullanılır.

$file = fopen("dosya.txt", "r");
if($file){
fseek($file, 20);
}
fclose($file);

Yukarıdaki örnek imleci dosya başından başlayarak 20. bayttan sonrasına yerleştirir.

fseek() işlevi üçüncü parametre olarak nereden itibaren sayılacağını belirtebilirsiniz. Varsayılan olarak SEEK_SET'dir.
SEEK_SET : Başlangıçtan itibaren sayılır.
SEEK_CUR : Mevcut konumdan itibaren sayılır. Bu durumda negatif değerler vererek imleci mevcut konumdan geriye ya da pozitif değer ile ileriye konumlandırmak mümkün olabilir.
SEEK_END : Sondan itibaren sayılır.

$file = fopen("dosya.txt", "r");
if($file){
//İmleci dosya başından 10 bayt ileri taşı
fseek($file, 10, SEEK_SET);

//İmleci mevcut konumundan 5 bayt ileri taşı
fseek($file, 5, SEEK_CUR);

//İmleci mevcut konumundan 5 bayt geri taşı
fseek($file, -5, SEEK_CUR);

// İmleci dosya sonundan 5 bayt geri taşı
fseek($file, 10, SEEK_END);
}
fclose($file);

rewind()

fopen() işlevi ile açılmış olan dosyada konumlandırıcıyı (imleci) dosyanın başına taşır.

$file = fopen("dosya.txt", "r");
if($file){
fgets($file, 10);
echo "İmleç " . ftell($file) . ". bayt üzerinde.\n";

rewind($file);

echo "İmleç " . ftell($file) . ". baytta.\n";
}
fclose($file);

Dosya Yazma

PHP'de dosya yazma işlemi için kullanabileceğiniz iki işlev vardır. Bunlar fwrite() ve ftruncate() işlevleridir.

Not : Bu işlevlerin her ikisinde de r kipi ile açılmış dosyalarda kullanamazsınız. r kipi dosyayı sadece okumak için açar. Yazmayı desteklemez.

Bu iki fonksiyon işlem yapabilmek için fopen() işlevinin dosyayı açmış olması gerekir. PHP'de dosya yazma işlemi için daha sık kullanılan bir işlev daha var file_put_contents() ki onu da yine bu bölümün sonunda anlatıyor olacağım.

fwrite()

fopen() ile açılmış olan bir dosyanın içerisine veri yazmak için kullanılır.
Bu işlev başarılı şekilde yazma işlemini tamamlarsa yazdığı verinin bayt cinsinden (tam sayı) boyutunu döndürür. Aksi halde false döndürür.

Not : Bazı PHP geliştiricileri fputs() işlevini kullanabilir. Bu hatalı değildir. fputs() işlevi fwrite() işlevinin takma adıdır. Bu yüzden fputs() işlevini burada anlatma gereği duymuyorum.

Dikkat : Ben dosyayı açarken w+ kipini kullandım. Dosyaya bir yazma işlemi yapılacak ise r kipi haricinde herhangi bir kip kullanılabilir. Bu kipleri ve ne işe yaradıklarını fopen() başlığı altındaki tabloda zaten paylaşmıştım.

$yeniIcerik = 'Burada dosyaya yeni eklenecek içeriği yazıyorum.';

$dosyaAc = fopen("dosya.txt", "w+");
if($dosyaAc){
fwrite($dosyaAc, $yeniIcerik);
}
fclose($dosyaAc);

fwrite() işlevi ile yazılacak veri için bayt cinsinden bir limit belirleyebilirsiniz. Belirlemek istediğiniz limit varsa üçüncü parametre olarak vermeniz yeterlidir.
Örneğin sadece 20 bayt yazsın istiyorsanız;

$yeniIcerik = 'Burada dosyaya yeni eklenecek içeriği yazıyorum.';

$dosyaAc = fopen("dosya.txt", "w+");
if($dosyaAc){
fwrite($dosyaAc, $yeniIcerik, 20);
}
fclose($dosyaAc);

ftruncate()

fopen() işlevi tarafından açılmış olan dosyanın içeriğinin belirtilen bayttan sonrasını silmek için kullanılır.
İşlem başarılı olursa true, başarız olursa false döndürür.

Not : Bu işlev için w ve w+ kipleri kullanılamaz. Bu kipler içeriği boşalttığı/sildiği için hatalı bir yazma işlemi yapılır.

$dosyaAc = fopen("dosya.txt", "a");
if($dosyaAc){
ftruncate($dosyaAc, 64);
}
fclose($dosyaAc);

Yukarıdaki örnek ilgili dosyanın içerisinde 64 baytlık karakteri atlayarak geri kalanı silecektir. Yani bir bakıma kırpma işlemi uygulayacak diyebiliriz.

file_put_contents()

Belirtilen dosyaya, belirtilen veriyi yazmak için kullanılır.
Bu işlev yazma işlemi başarılı olursa yazılan verinin bayt cinsinden (tamsayı veri türünde) boyutunu döndürür. İşlem başarısız olursa false döner.

Kullanımı son derece basit olduğundan genellikle dosya yazma işlemlerinden tercih edilen işlevdir.

$icerik = "Buraya dosyaya yazacağınız veriyi girebilirsiniz.";

$yaz = file_put_contents("dosya.txt", $icerik);

Yukarıdaki örnek dosya içeriğini tamamen silerek/boşaltarak verilen değeri yazar.
Dosyanın mevcut içeriğinin üzerine eklemek yani sonuna yazmak istiyorsanız;

$path = "dosya.txt";
$icerik = file_get_contents($path);
$icerik .= "\n";
$icerik .= "Buraya dosyaya eklenecek içeriği giriyoruz.";

$yaz = file_put_contents($path, $icerik);

Ancak doğru kullanım şekli bu değildir, sadece görün diye verdim. Bunun yerine üçüncü parametre olarak FILE_APPEND verirseniz dosyanın önceki içeriği silinmeyecek yeni veri dosyanın sonuna eklenecektir.

$icerik = "Bu içerik dosya sonuna eklenecektir.";

$yaz = file_put_contents("dosya.txt", $icerik);

.CSV Dosyaları Üzerinde Çalışma

Bu noktada CSV dosyasının ne olduğunu bilmeyenler için şöyle çok kısa bir şekilde açıklamam gerekirse;

Verileri belli bir ayraç (genellikle virgül ",") ile ayrılmış ve her satırın bir veriyi ifade ettiği metin tabanlı dosyalardır. Bu dosyalar genellikle bir verinin (tablo ve ya veri tabanı olabilir) taşınması işleminde kullanılır.

fgetcsv()

fopen() işlevi tarafından açılan csv dosyasını satır satır okumak için kullanılır.
Bu işlev eğer fopen() işlevi ile oluşturulmuş bir kaynak (resource) belirtilmezse null, bir hata oluşursa false, başarılı olursa verileri içeren indisli bir dizi döndürür.

Genellikle şu 3 parametre ile kullanılır;

Kaynak (resource) : fopen() işlevi tarafından oluşturulmuş kaynak

Uzunluk (int) : Her satırda okunacak maksimum karakter sayısı (tamsayı veri türünde). Belirtilmezse varsayılan değeri 0'dır. Belirtilmemesi ya da 0 belirtilmesi halinde bir sınırlama yapılmaz ancak işlem yavaşlayabilir. En uzun satırdan (satır sonu karakteri dahil) daha büyük bir değer olmalıdır.

Ayraç (char) : İsteğe bağlıdır. Varsayılan virgül (,)dür.

$open = fopen("csv-ornek.csv", "r");
if($open){
while($row = fgetcsv($open)){
echo $row[0] . " " . $row[1] . "\n";
}
}
fclose($open);

fputcsv()

fopen() işlevi tarafından açılan csv dosyasına veri yazmak için kullanılır.
Yazma işlemi başarılı olursa yazılan verinin bayt cinsinden boyutu (tamsayı veri türünde), işlem başarısız olursa false döndürür.

Eklenecek her bir satır bir dizi olarak verilir.

$liste = [
["Hakan", "Taşkın", "Sakarya"],
["Engin", "Yamyam", "Amasya"]
];

$open = fopen("csv-ornek.csv", "r+");
if($open){
foreach($liste as $row){
fputcsv($open, $row);
}
}
fclose($open);

Veriler arasında ayraç olarak virgül (,) harici birşey kullanıyorsanız bunu 3. parametre olarak belirtmeniz gerekiyor.

Dosya İzin ve Kiplerinin Yönetimi

PHP dosya ve dizinlerin izin ve kiplerini yönetmenizi sağlayan işlevlere sahiptir.

İşletim ve dosya sistemleri konusu olsa da bilmeyenler için basitçe kip ve dosya izinlerini konusunu açıklayayım.

Dosya kipi : Dosya üzerinde kimlerin hangi işlemi yapabileceğini belirten sekizlik bir değer ile ifade edilen dosya özelliğidir. Bazı işletim sistemleri bunu dizge (metin) ya da onluk bir değer olarak gösterebilir.

Sık kullanılan bazı dosya kipleri (Sekizlik)

Kip | Açıklama
0777 | Herkes okuyabilir, çalıştırabilir ve yazabilir.

0755

Sahibi her şeyi yapabilir.
Grubu ve diğer kişiler okuyup çalıştırabilir.

0744

Sahibi her şeyi yapabilir.
Grubu ve diğer kişiler sadece okuyabilir.

0644

Sahibi okuyup yazabilir.
Grubu ve diğer kişiler okuyup çalıştırabilir.

0750

Sahibi her şeyi yapabilir.
Grubu okuyup çalıştırabilir.
Diğer kişiler hiçbir şey yapamaz.

0600

Sahibi okuyup yazabilir.
Grubu ve diğer kullanıcılar hiçbir şey yapamaz.

chmod()

Belirtilen dosyanın ya da dizinin dosya kipini belirtilen kip yapmayı dener.
İşlem başarılı olursa true, başarısız olursa false döner.

chmod("dosya.txt", 0755);

chown()

Belirtilen dosyanın ya da dizinin sahibini değiştirmeyi dener.
İşlem başarılı olursa true, başarısız olursa false döner.

chown("dosya.txt", 0); // 0 admin kullanıcının ID'sidir.

chown("dosya.txt", "root"); // root kullanıcı adıdır.

chgrp()

Dosya ya da dizinin kullanıcı grubunu değiştirmeyi dener.
İşlem başarılı olursa true, başarısız olursa false döner.

chgrp("dosya.txt", 0); // 0 root grubunun ID'sidir.

chgrp("dosya.txt", "root"); // root grubunun adıdır.

Evet, PHP'de dosya ve dizin işlemleri burada anlattığım işlev ve yöntemlerle gerçekleştiriliyor. Görebileceğiniz gibi PHP bu konuda da son derece zengindir.