Clear        


                
                    using _12_InterfacesVsAbstractClasses._1_InterfaceOrnegi.Bases;
using System.Text;

namespace _12_InterfacesVsAbstractClasses._1_InterfaceOrnegi
{
    /// <summary>
    /// Öğrenciler için metinsel (.txt uzantılı) dosya işlemlerini gerçekleştiren somut (concrete) sınıf.
    /// </summary>
    class MetinselOgrenciDosya : IOgrenciDosya // MetinselOgrenciDosya sınıfı IOgrenciDosya interface'ini implemente eder,
                                               // MetinselOgrenciDosya bir IOgrenciDosya'dır şeklinde de okunabilir
    {
        #region Özellikler
        public string DosyaYolu { get; set; } // interface'i implemente ettiğimizden DosyaYolu özelliği oluşturuldu
        #endregion



        #region Methodlar
        /// <summary>
        /// Metin dosyası içeriğini sayiEkle parametresine göre string olarak dönen method.
        /// </summary>
        /// <param name="sayiEkle"></param>
        /// <returns>string</returns>
        public string OgrencileriGetir(bool sayiEkle) // interface'i implemente ettiğimizden method tanımı üzerinden implemente etmemiz için method oluşturuldu
        {
            string ogrenciler = ""; // dosyadan okuyacağımız öğrenci bilgilerini atayacağımız ve ilk olarak da içinde hiç bir karakter olmayan string değeri ataması yaptığımız değişken

            if (sayiEkle) // eğer sayiEkle true ise dosyadan okuduğumuz öğrenci bilgilerinin başına artacak şekilde sayı ekleyeceğiz
            {
                string[] ogrenciDizisi = File.ReadAllLines(DosyaYolu, Encoding.UTF8); // önce dizi olarak öğrenci bilgilerini alıyoruz,
                                                                                      // File class'ının ReadAllLines methodu dosya içeriğindeki her bir satır üzerinden string[] döner,
                                                                                      // Encoding.UTF8 parametresi yazılmasa da olur ancak eğer metinsel dosya içeriğinde Türkçe karakterler
                                                                                      // (utf-8 karakter kümesi) varsa karakterlerde sorun yaşanmaması için kullanılması iyi olur

                for (int i = 0; i < ogrenciDizisi.Length; i++) // sonra dizideki her bir öğrenci bilgisini turlayarak öğrenci bilgisi başına birer birer artacak şekilde sayı ekliyoruz
                {
                    ogrenciler += i + 1 + ") " + ogrenciDizisi[i] + "\n";
                }

                ogrenciler = ogrenciler.TrimEnd('\n'); // döngü sonucunda oluşan ogrenciler'deki en son \n (new line) escape character'ini (escape sequence) temizliyoruz
            }
            else // eğer sayiEkle false ise dosyadan okuduğumuz öğrenci bilgilerini ekstra hiç bir işlem yapmadan döneceğiz
            {
                ogrenciler = File.ReadAllText(DosyaYolu, Encoding.UTF8); // File class'ının ReadAllText methodu dosya içeriğini string olarak döner
            }

            return ogrenciler; // öğrenci bilgilerini dönüyoruz
        }



        /// <summary>
        /// String olarak gönderilen ogrenci parametresini dosya sonuna ekleyen (append) method.
        /// </summary>
        /// <param name="ogrenci"></param>
        public void OgrenciEkle(string ogrenci) // interface'i implemente ettiğimizden method tanımı üzerinden implemente etmemiz için method oluşturuldu
        {
            File.AppendAllText(DosyaYolu, "\n" + ogrenci, Encoding.UTF8); // File class'ının AppentAllText methodu gönderilen string tipindeki veriyi dosyanın sonuna ekler,
                                                                          // eğer WriteAllText methodu kullanılsaydı gönderilen veri mevcut verinin üzerine yazılacaktı (overwrite)
                                                                          // dolayısıyla mevcut veri kaybedilecekti
        }



        /// <summary>
        /// DosyaYolu özelliği üzerinden dosya adını dönen method.
        /// </summary>
        /// <returns>string</returns>
        public string DosyaAdiGetir() // interface'i implemente ettiğimizden method tanımı üzerinden implemente etmemiz için method oluşturuldu
        {
            string dosya = Path.GetFileName(DosyaYolu); // Path sınıfının GetFileName methodu dosya adı ile birlikte uzantısını döner, örneğin Öğrenciler.txt

            return dosya.Split('.')[0]; // sadece dosya adını dönebilmek için . karakterine göre dosya'yı parçalayıp elde ettiğimiz dizideki ilk elemanı dönüyoruz, örneğin Öğrenciler
        }



        /// <summary>
        /// DosyaYolu özelliği üzerinden dosya uzantısını dönen method.
        /// </summary>
        /// <returns>string</returns>
        public string DosyaUzantisiGetir() // interface'i implemente ettiğimizden method tanımı üzerinden implemente etmemiz için method oluşturuldu
        {
            string dosya = Path.GetExtension(DosyaYolu); // Path sınıfının GetExtension methodu dosya uzantısını döner, örneğin .txt

            return dosya.Substring(1).ToLower(); // sadece dosya uzantısını dönebilmek için dosya üzerinden 1. index'ten başlayıp sona kadar sub string alıyoruz
                                                 // ve tüm karakterleri küçük harfe dönüştürüyoruz, örneğin txt
        }
        #endregion
    }
}