https://buraksenyurt.com/Burak Selim Şenyurt - BCL2011-01-05T10:16:41+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://buraksenyurt.com/post/SystemIOFile-Tarafindaki-Yenilikler.Net Framework 4.0 System.IO.File Tarafındaki Yenilikler2010-10-25T21:45:00+00:00bsenyurt<p> <img style="float: right;" src="/pics/2010%2f6%2fblg199_Giris_.jpg" alt="" />Merhaba Arkadaşlar,</p>
<p>Bu yazımızda ele alacağımız konu ile ilişkili olarak kullanacağım giriş resmi için uzun bir süre araştırma yapmak zorunda kaldım. Sanırım yazıyı yazdığım bu sıcak yaz gününde devrelerim istediğim randımanı vermedi. Ancak en azından yandaki resim, anlatacağım ilk konu ile doğrudan alakalı olarak düşünülebilir. Bu resimde üst üste binmiş onlarca metre yüksekliğe varan dosya dolapları olduğu ifade edilemekte. Bunların hepsinin tek bir dosya içerisinde birleştirildiğini düşünün. Üstelik bu dosya <strong>text tabanlı</strong> olsun.</p>
<p>Bu tip bir dosyanın bir bankadan gönderilme olasılığı aslında çok yüksektir. Geçmiş deneyimlerimi düşündüğümde son derece olağan bir durum. Örneğin bundan önce çalıştığım ve outsource olarak görev yaptığım bankada, boyutları 600 mb’ ın üzerinde olan text tabanlı dosyalar sistemler arasında dolaşıp durmaktaydı. Hatta bu dosyalardan bazıları <strong>SSIS</strong> paketlerine sokularak <strong>veritabanı</strong> ortamına aktarılmaktaydı. Hatta <strong>SSIS</strong> uzmanı olmamama rağmen Proje Yöneticisi tarafından bir dönem bana da böyle bir iş verildiğini ifade etmek isterim <img title="Undecided" src="/editors/tiny_mce3/plugins/emotions/img/smiley-undecided.gif" alt="Undecided" border="0" /></p>
<p>Tabi bu tip dosyaların en büyük özelliği de veri taşımak amacıyla satır ve sütun kavramlarını kullanmalarıdır. Ayrıca verinin çok yalın bir formatta taşınması ve her tür platform tarafından kolayca ele alınması, hatta çıplak gözle<em>(Tabi zaman zaman. Nitekim benim üzerinde çalıştığım SSIS paketlerinin sütunlarının sayısı 250’ ye varmaktaydı <img title="Sealed" src="/editors/tiny_mce3/plugins/emotions/img/smiley-sealed.gif" alt="Sealed" border="0" /> )</em> rahatlıkla okunabilmesi gibi avantajlar da söz konusudur. Buna göre aşağıdaki gibi bir text içeriği doğru bir veri saklama biçimi olarak düşünülebilir.</p>
<p><img src="/pics/2010%2f6%2fblg199_TextContent_.gif" alt="" /></p>
<p>Burada birbirleriyle<strong> |</strong> işaretleri şeklinde ayrılmış sütunlar söz konusudur. Toplam 4 satırdan oluşan veri içeriğini programatik ortamda da okumak son derece kolaydır. Bunun için, kolaya kaçan geliştiriciler <strong>.Net Framework 2.0 </strong>ile birlikte <strong>File </strong>sınıfına eklenmiş <strong>static ReadAllLines</strong> metodunu kullanır. Aşağıdaki kod parçasında görüldüğü gibi.</p>
<p><img src="/pics/2010%2f6%2fblg199_ReadAllLines_.gif" alt="" /></p>
<p><strong>ReadAllLines</strong> metodu parametre olarak dosya adresini almakta ve içeriğinde tüm satırları <strong>string</strong> tipinden bir diziye aktarmaktadır. <strong>Debug</strong> çıktısında, string dizisine aktarılan içerik net bir şekilde görülebilir. Tabi bu adımdan sonra elde edilen<strong> string[]</strong> dizisi üzerinde dolaşılıp <strong>| </strong>işaretlerine göre ayrıştırma yapılarak sütunlara da kolayca erişilebilir. Ancak önemli bir sorun da vardır?</p>
<p><strong>Boyutu çok yüksek olan bir dosyanın ReadAllLines metodu yardımıyla okunmasının sakıncıları var mıdır?</strong></p>
<p>Aslında en büyük sakınca <strong>ReadAllLines</strong> metodu, dosyanın tüm satırlarını <strong>string[]</strong> diziye aktarana kadar, içinde çalıştığı <strong>Thread’</strong> i duraksatmaktadır. Bir başka deyişle <strong>ReadAllLines</strong> metodu ile okunan satırların tamamı <strong>string</strong> dizisine aktarılmadan kod bir sonraki satıra inmeyecektir. İşte <strong>Base Class Library->IO</strong> bünyesinde getirilen yeni <strong>static</strong> metodlardan birisi bu vakayı çözmek amacıyla getirilmiştir. <strong>File.ReadLines </strong>metodu.</p>
<p><strong>ReadLines</strong> static metodunun <strong>aşırı yüklenmiş(Overload)</strong> iki versiyonu vardır. Her ikiside satırları okunacak dosyayı parametre olarak almaktadır. Metodlar geriye <strong>IEnumerable<string></strong> <strong>Arayüzü(Interface)</strong> tarafından taşınabilecek bir referans döndürmektedir. <strong>ReadLines</strong> metodu aslında dosyanın satırları arasında gezinmeyi sağlayacak bir numaralandırıcıyı hazırlamaktadır. Bu sebepten kod satırı anında alt satıra inebilir. Üstelik tüm satırların yüklenmesi de söz konusu değildir. Örneğin çok büyük bir <strong>text</strong> dosyasının sadece ilk 3 satırını almak istediğimizde aşağıdaki gibi bir kod parçası işe yarayacaktır.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.IO;
using System.Collections.Generic;
namespace NewIOFeatures
{
class Program
{
static void Main(string[] args)
{
string filePath = Path.Combine(Environment.CurrentDirectory, "Bilgiler.txt");
//string[] lines=File.ReadAllLines(filePath);
IEnumerable<string> lines=File.ReadLines(filePath);
int i = 0;
foreach (string line in lines)
{
if (i < 3)
{
Console.WriteLine(line);
i++;
}
else
break;
}
}
}
}</pre>
<p><img src="/pics/2010%2f6%2fblg199_ReadLinesRuntime_.gif" alt="" /></p>
<p>Bu kod parçasında görüldüğü üzere <strong>foreach</strong> döngüsü ile <strong>Bilgiler.txt</strong> dosyasının satırları üzerinde hareket edilmeye başlanmaktadır. <strong>Integer</strong> tipinden olan<strong> i</strong> değişkeninden yararlanılarak bir sayaç oluşturulmuş ve ilk 3 satır okunduktan sonra <strong>break keyword</strong>’ ü yardımıyla döngüden çıkılması sağlanmıştır. Tabi şunu hatırlatmamızda yarar vardır. <strong>foreach</strong> döngüsü yardımıyla dosya içerisindeki tüm satırların dolaşılması <strong>ReadAllLines</strong> metodunun yaptığı işin aynısıdır. Dolayısıyla duruma göre uygun olan metodu kullanmakta yarar vardır. <strong>System.IO</strong> tarafında <strong>BCL </strong>takımı tarafından getirilen yeniliklerden birisini bu şekilde özetlemiş olduk. Gelelim diğer bir yeniliğe.</p>
<p><strong>File</strong> tipinin dosya okuma ve yazma işlemlerinde sağladığı kolaylık bilinmektedir. Ancak yine de bazı iyileştirmeler gerekmiştir. Söz gelimi <strong>WriteAllLines</strong> metodunun <strong>.Net 4.0</strong> öncesindeki versiyonunu ele alalım.</p>
<p><img src="/pics/2010%2f6%2fblg199_WriteAllLinesOld_.gif" alt="" /></p>
<p><strong>WriteAllLines</strong> metodu bir önceki sürümde iki aşırı yüklenmiş versiyona sahiptir. Bu metod belirtilen dosyaya, satır bazlı string bir içeriğin eklenmesi amacıyla kullanılmaktadır. Çok güzel. Ama eksik. Nitekim versiyonda dikkati çeken nokta, sadece string tipinden bir dizinin kullanılabiliyor olmasıdır. Peki bunun ne gibi bir sakıncası olabilir?</p>
<p><strong>string[] tipinden olmayan, örneğin List<string> gibi bir koleksiyon içeriğinin WriteAllLines metodu yardımıyla dosyaya yazılabilmesi için, önce string[] dizisine çevrilmesi gerekmektedir.</strong></p>
<p><strong>Visual Studio 2008</strong> üzerinde yazılmış örnek bir kod parçası ile bu durumu görelim.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.Collections.Generic;
using System.IO;
namespace IO
{
class Program
{
static void Main(string[] args)
{
string filePath=Path.Combine(Environment.CurrentDirectory,"Bilgiler.txt");
List<string> content=new List<string>{
"10001|Burak Selim Şenyurt|1000|A"
,"10002|Bili Geyt|2000|B"
,"10003|Maykıl Cordın|3400|B"
,"10004|Megın Fox|2200|C"
};
File.WriteAllLines(filePath, content.ToArray());
}
}
}</pre>
<p>Burada <strong>List<string></strong> tipinden olan koleksiyonun içeriğinin <strong>Bilgiler.txt</strong> dosyasına yazıldığını görmektesiniz. Ancak <strong>WriteAllLines</strong> metodunun içeriğine dikkat edilecek olursa, <strong>content</strong> isimli değişkenin <strong>ToArray</strong> metodu yardımıyla <strong>string[]</strong> dizisine dönüştürüldüğü görülmektedir. İşte <strong>BCL</strong> takımı <strong>.Net Framework 4.0</strong>’ da <strong>WriteAllLines</strong> metodunun yeni bir <strong>aşırı yüklenmiş(Overload)</strong> versiyonunu yazarak bu durumu düzeltmiştir.</p>
<p><img src="/pics/2010%2f6%2fblg199_WriteAllLinesNew_.gif" alt="" /></p>
<p>Buna göre daha önceki versiyonda yapmak zorunda kaldığımız <strong>ToArray </strong>dönüştürmesine gerek yoktur. Son olarak yazdığımız kodun <strong>Visual Studio 2010</strong> üzerinde geliştirilen yeni hali aşağıdaki gibidir.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">string filePath = Path.Combine(Environment.CurrentDirectory, "Bilgiler.txt");
List<string> content = new List<string>{
"10001|Burak Selim Şenyurt|1000|A"
,"10002|Bili Geyt|2000|B"
,"10003|Maykıl Cordın|3400|B"
,"10004|Megın Fox|2200|C"
};
File.WriteAllLines(filePath, content);</pre>
<p>Bu yenilik sayesinde <strong>WriteAllLines</strong> metodunun <strong>string Array</strong> dışındaki <strong>IEnumerable<string></strong> arayüzünü uygulayan tipler ile de çalışabilmesi sağlanmıştır. Gelelim bu yazımızda değineceğimiz son yeniliğe.</p>
<p><strong>WriteAllLines</strong> metodu <strong>content</strong> değişkeni ile aldığı içeriği ilgili dosyaya yazarken dosyanın sürekli yeniden oluşturulmasına neden olmaktadır. Oysaki dosya sonuna ilave yapmamız da gerekebilir. <strong>.Net Framework 4.0</strong> öncesindeki sürümde <strong>AppendAllLines</strong> isimli bir metod <span style="text-decoration: underline;">bulunmamaktadır</span>. Ancak <strong>.Net Framework 4.0</strong> ile birlikte bu metod <strong>File</strong> tipine eklenmiştir ve aşağıdaki örnek kod parçasında olduğu gibi kullanılabilir.</p>
<pre class="brush:csharp;auto-links:false;toolbar:false" contenteditable="false">using System;
using System.IO;
using System.Collections.Generic;
namespace NewIOFeatures
{
class Program
{
static void Main(string[] args)
{
string filePath = Path.Combine(Environment.CurrentDirectory, "Bilgiler.txt");
List<string> content = new List<string>{
"10001|Burak Selim Şenyurt|1000|A"
,"10002|Bili Geyt|2000|B"
,"10003|Maykıl Cordın|3400|B"
,"10004|Megın Fox|2200|C"
};
File.WriteAllLines(filePath, content);
List<string> newLines = new List<string>
{
"10006|Komiser Kolomb|2345|Z"
};
File.AppendAllLines(filePath, newLines);
}
}
}</pre>
<p><strong>AppendAllLines</strong> metodu<strong> IEnumerable<string></strong> tipi ile çalışmakta ve bu tipin çalışma zamanındaki içeriğini parametre olarak verilen dosyanın sonuna eklemektedir.</p>
<p>Tabi <strong>BCL</strong> takımı tarafından getirilen daha pek çok yenilik daha söz konusudur. Örneğin bunlardan bazılarını hemen araştırmaya başlayabilirsiniz.</p>
<ul>
<li>Directory.EnumerateFiles</li>
<li>Directory.EnumerateDirectories</li>
<li>Directory.EnumerateFileSystemEntries</li>
</ul>
<p>vb...</p>
<p>Yeri geldikçe bunları toplu olarak ele almaya çalışıyor olacağız. Bu yazımızda <strong>File</strong> tipi için öne çıkan bazı yenilikleri gördük. Buna göre;</p>
<ul>
<li><strong>ReadLines</strong> metodu yardımıyla satır bazlı bir <strong>text</strong> içeriğinin bir seferde değil ama bir iterasyon yardımıyla okunabileceğini gördük.</li>
<li><strong>WriteAllLines</strong> metodunun sadece <strong>string Array</strong> tipi ile çalışan versiyonu yerine <strong>IEnumerable<string></strong> ile çalışan bir versiyonunun geliştirildiğini gördük. Bu sayede bir önceki sürümde söz konusu olan <strong>ToArray</strong> metodu ile diziye dönüştürme zorunluluğunun ortadan kalktığına şahit olduk.</li>
<li>Son olarak dosya sonuna <strong>IEnumerable<string></strong> ile işaret edilen bir içeriğin eklenebilmesini sağlayan <strong>AppendAllLines</strong> metoduna değindik.</li>
</ul>
<p>Böylece geldik bir yazımızın daha sonuna. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>
<p><a href="https://buraksenyurt.com/pics/2010%2f6%2fNewIOFeatures.rar">NewIOFeatures.rar (21,53 kb)</a><strong> [Örnek Visual Studio 2010 Ultimate sürümünde geliştirilmiş ve test edilmiştir]</strong></p>2010-10-25T21:45:00+00:00base class library.net framework 4.0filesystem.iobsenyurtBu yazımızda ele alacağımız konu ile ilişkili olarak kullanacağım giriş resmi için uzun bir süre araştırma yapmak zorunda kaldım. Sanırım yazıyı yazdığım bu sıcak yaz gününde devrelerim istediğim randımanı vermedi. Ancak en azından yandaki resim, anlatacağım ilk konu ile doğrudan alakalı olarak düşünülebilir.https://buraksenyurt.com/pingback.axdhttps://buraksenyurt.com/post.aspx?id=e4ee853f-8f3e-4440-8a84-0e3cbe3664560https://buraksenyurt.com/trackback.axd?id=e4ee853f-8f3e-4440-8a84-0e3cbe366456https://buraksenyurt.com/post/SystemIOFile-Tarafindaki-Yenilikler#commenthttps://buraksenyurt.com/syndication.axd?post=e4ee853f-8f3e-4440-8a84-0e3cbe366456