Archive for the ‘.NET’ tag
Deflate Stream – Compress & Decompress
Merhaba, üzerinde çalışmakta olduğum projede bugun yapmış olduğum bir işlemin kodlarını sizinle paylaşmak istiyorum. Senaryo aslında çok derin, ama ben kısaca bahsedeyim. Kullanıcı bir Windows App yardımıyla SQL’e dosya yükler, veya bu dosyayı download eder. Tabi bu aşamada önemli olan şey içeriye yüklenen verinin boyutunun yüksek olabileceğinden dolayı bu dosyanın içeriğini sıkıştırarark yüklemektir. Veriyi database’de tutacagımız alan BINARY tipindedir. Buyrun kodlar.
Dosyayı OpenFileDialog ile kullanıcıdan seçtiriyorum, ve seçilen dosyanın path’ini aşağıdaki function’a gönderiyorum.
1: public byte[] FileToByteArray(string filePath)
2: {
3: FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
4: BinaryReader br = new BinaryReader(fs);
5:
6: long totalBytes = new FileInfo(filePath).Length;
7:
8: byte[] buffer = br.ReadBytes(Convert.ToInt32(totalBytes));
9: bufferSize = totalBytes;
10:
11: fs.Close();
12: fs.Dispose();
13: br.Close();
14:
15: return Compress(buffer);
16: }
Bu function oluşturduğu byte[] değerlerini Compress isimli aşağıdaki fonksiyon gönderiyor.
1: public static byte[] Compress(byte[] data)
2: {
3: MemoryStream ms = new MemoryStream();
4: DeflateStream ds = new DeflateStream(ms, CompressionMode.Compress);
5: ds.Write(data, 0, data.Length);
6: ds.Flush();
7: ds.Close();
8: return ms.ToArray();
9: }
Bir dosyayı alarak, sıkıştırdık ve DB’ye kayıt etmeye hazır hale getirdik.
Şimdide DB’deki dosyayı kullanıcının download etmesini sağlayacak kod bloğunu yazıyorum.
1: FolderBrowserDialog dialog = new FolderBrowserDialog();
2: dialog.ShowDialog(this);
3:
4: if (!string.IsNullOrEmpty(dialog.SelectedPath))
5: {
6: string file = String.Format("{0}\\{1}", dialog.SelectedPath, ocd.FILE_NAME);
7:
8: FileStream fs = new FileStream(file, FileMode.OpenOrCreate, FileAccess.Write);
9: BinaryWriter bw = new BinaryWriter(fs);
10:
11: bw.Write(Decompress(ocd.FILE_DATA.ToArray()).ToArray());
12: bw.Flush();
13:
14: bw.Close();
15: }
Burada 11. satırda çağırılan function’ın almış oldugu ocd.FILE_DATA, bizim SQL’de depolamış olduğumuz binary verisidir.
Gönderildiği Decompress fonksiyonunun içeriği aşağıdaki gibidir.
1: public byte[] Decompress(byte[] data)
2: {
3: const int BUFFER_SIZE = 256;
4: byte[] tempArray = new byte[BUFFER_SIZE];
5: List<byte[]> tempList = new List<byte[]>();
6: int count = 0, length = 0;
7:
8: MemoryStream ms = new MemoryStream(data);
9: DeflateStream ds = new DeflateStream(ms, CompressionMode.Decompress);
10:
11: while ((count = ds.Read(tempArray, 0, BUFFER_SIZE)) > 0)
12: {
13: if (count == BUFFER_SIZE)
14: {
15: tempList.Add(tempArray);
16: tempArray = new byte[BUFFER_SIZE];
17: }
18: else
19: {
20: byte[] temp = new byte[count];
21: Array.Copy(tempArray, 0, temp, 0, count);
22: tempList.Add(temp);
23: }
24: length += count;
25: }
26:
27: byte[] retVal = new byte[length];
28:
29: count = 0;
30: foreach (byte[] temp in tempList)
31: {
32: Array.Copy(temp, 0, retVal, count, temp.Length);
33: count += temp.Length;
34: }
35:
36: return retVal;
37: }
İşte bu kadar basit. Bu sistem sayesinde her türlü verinin içeriğini Compress ederek DB’de saklayabilirsiniz. Hatırladığım kadarıyla SQL’de binary field’ı max 2 GB’a kadar verı tutabiliyor. 4 GB’da olabilir tabi
Namespace Nedir, Value ve Reference Type’ları Nedir?
Namespaces
Diger .Net dilleri gibi C#’ta .NET base class library’sinde tanımlanmıs datatype’ları kullanır. Bu classlar namespace adı altında gruplanmıstır. Namespace’e diger bir tanımlama ile classları kullanırken fonksiyonel bir sekilde ulasmamızı saglayan logic containerlar diyebiliriz. Örnek olarak System.Windows.Forms namespace’i ni verebilirim
1: namespace Desta.Deneme.DenemeClasses
2: {
3: public class a()
4: {
5: Public a(){}
6: private string dbname;
7: public string dbName
8: {
9: Get{return dbname;}
10: Set{dbname=value;}
11: }
12: }
13: }
using kelimesi ile de namespaceler içerisinde bulunan classları projemize dajil etmis oluruz.. namespace using ile projeye dahil edildikten sonra herhangi bir period belirtmeden namespace içerisinde bulunan tanımlamalara ulasabiliriz.
using Desta.Deneme.DenemeClasses;
böylece deneme namespace içindeki tüm classlara ve içinde bulunan property ve fonksiyonlara erisebiliriz.
using ile compile islemi sırasında modüller arasında herhangi bir link tanımlamıs olmayız.
using ile ilgili ilginç bir sey ise onu alias type tanımlamak için kullanabilmemiz. Asagıdaki örnek System.Int32 type’ını intecir adıyla kullanmamızı saglar.
1: using intecir=System.Int32;
2: public class AliasOrnek
3: {
4: public static intecir Main()
5: {
6: intecir i=1;
7: intecir j=i+1;
8: System.Console.WriteLine(j);
9: return 0;
10: }
11: }
System Namespace
Common Laguage Specification (CLS) bir programlama dili tarafından desteklenmesi kaçınılmaz olan bir çok datatype’ı tanımlayan zengin bir library’e sahiptir. Bu libraryde bulunan Boolean, string, integer, kronolojik ve finansal valueların hepsi System namespace’inin içerisinde yer alır.
Bütün typelar object type’ından inherit edilir. Böylece bir object’in referansı herhangi bir tipdeki degiskeni tutmak için kullanılabilir.
Long type’ın bit olarak büyüklügü 64′e çıkarılmıstır. Bu sayede Whistler ve XP platformlarında 64 bitlik programlar için bir hazırlık saglanmıstır. (64 bitlik olan bu isletim sistemleri Intel’in yeni nesil 64 bitlik islemcisi Itanium uyumludur)
System NameSpace i birçok alt kullanıcı barındırır.
System.Web
HTML ve Web kontrollerini ,güvenlik, sessionstate, konfigurasyon, bölgesel ayarlar gibi metodları barındırır.
System.Data
Genel olarak veritabanı islemlerimiz için kullandıgımız NameSpace’dir.
System.Windows.Forms
Windows Forms uygulamaları için özel ayarları barındırır.
System.Drawing
Yazdırma ve resim isleme ile ilgili islemlerde kullandıgımız NameSpace’dir.
System.XML
XML islemleri için kullanılmktadır.
süphesiz .Net Framework ün bize sundugu bu zengin kütüphane System NameSpace’i ile sınırlı degil.
Value ve Reference Tipleri
C# programlama dilinde bildiginiz gibi veri türlerini Reference Types Value Types olmak üzere iki kısma ayırıyoruz.
.NET dilleri tarafından kullanılan yada yaratılan her class value ve referans tipleri olarak kategorilendirilebilir. Value ve referans tipleri iki belirgin farklılık gösterir : hafızada tutuldukları yerler ve atama islemi içeriklerdeki davranıslarına göre.
Value tipler stackte tutulur, her iki value degeri için yapılmıs atama islemi ile hafızada birbirinin kopyası iki bölüm olusturulur. Referans tipler ise heap’de tutulur. Her iki referans degeri için yapılmıs atama islemi ile memory’deki tek bir yere iki ayrı referans olusturulur.
Asagıdaki kod parçasında bir referans türüne ve bir de deger türüne null degerler atanmaya çalısılmaktadır.
1: using System;
2: namespace c1
3: {
4: class c1
5: {
6: static void Main(string[] args)
7: {
8: string refTuru=null;
9: int dTuru=null;
10: }
11: }
12: }
13: Bu uygulamayı derlemeye çalıstıgımızda Cannot convert null to 'int' because it is a value type hatasını alırız. Aynı durumu kendi tanımladıgımız referans ve deger türleri içinde gerçeklestirebiliriz. Asagıdaki kod parçasında bu durum örneklenmistir.
14: using System;
15: namespace c2
16: {
17: class c2
18: {
19: }
20: struct Dvd
21: {
22: }
23: class C1
24: {
25: static void Main(string[] args)
26: {
27: Kitap kitap=null;
28: Dvd dvd=null;
29: }
30: }
31: }
Bu kod parçasındada aynı hatayı alırız. Çünkü struct’ lar deger türüdür ve bu sebeple null degerler alamazlar. Oysaki aynı istisnai durum class gibi kendi tanımlamıs oldugumuz referans türleri için geçerli degildir. Peki deger türlerinin null deger içerme ihtiyacı ne zaman dogabilir? Bir veritabanı uygulamasını göz önüne alalım. Bu tabloda int, double gibi deger türlerine karsılık gelecek alanların var oldugunu düsünelim. Veri girisi sırasında bu int ve double degiskenleri null olarak tabloya aktarmak isteyebiliriz. Ya da tablodan veri çekerken, deger türü karsılıgı alanların null deger içerip içermedigini anlamak isteyebiliriz. Iste bu gibi durumlarda deger türlerinin null veriler içerebilecek yapıda olması, kodumuzun ölçeklenebilirligini arttıracak bir yetkinlik olarak düsünülebilir. Veritabanları için geçerli olan bu senaryoyu göz önüne almadan önce C# 2.0 için deger türlerinin nasıl null veriler tasıyabilecegini incelemeye çalısalım. Deger türlerinin C# 2.0 için iki versiyonu vardır. Nullable deger türleri ve Non-Nullable deger türleri. Bir deger türünün null degerler içerecek tipte olacagını belirtmek için ? tip belirleyicisi kullanılır.
1: using System;
2: using System.Collections.Generic;
3: using System.Text;
4: namespace TestOfNullableValues
5: {
6: class P
7: {
8: static void Main(string[] args)
9: {
10: int? maas;
11: double? pi;
12: maas = null;
13: pi = null;
14: }
15: }
16: }
17: Yukarıdaki kod parçası sorunsuz olarak derlenecek ve çalısacaktır
18: Asagıdaki kod ile iki value degerine atama yapılmakta ve hafızada iki deger kopyası olusturulmaktadır. (kodu derleyip çalıstırmak için /unsafe switch'ini kullanın)
19: using System;
20: public class Simpleclass
21: {
22: public static int Main()
23: {
24: int i;
25: int j;
26: i=5;
27: j=i;
28: Console.WriteLine("i="+i);
29: Console.WriteLine("j="+j);
30: unsafe
31: {
32: if (&i==&j)
33: {
34: Console.WriteLine("i ve j'nin adresleri aynı");
35: }
36: else
37: {
38: Console.WriteLine("i ve j'nin adresleri farklı");
39: }
40: }
41: Console.ReadLine();
42: return 0;
43: }
44: }
45: Bu kod ise iki referans degerine atama yapmakta ve hafızadaki tek kopyaya ulasmaktadır.
46: using System;
47: public class ReferenceType
48: {
49: public int MyValue;
50: }
51: public class SimpleClass
52: {
53: public static int Main()
54: {
55: ReferenceType i;
56: ReferenceType j;
57: i=new ReferenceType();
58: i.MyValue=5;
59: j=i;
60: Console.WriteLine("i.MyValue="+i.MyValue);
61: Console.WriteLine("j.MyValue="+j.MyValue);
62: unsafe
63: {
64: if (i==j)
65: {
66: Console.WriteLine("i ve j aynı adreste");
67: }
68: else
69: {
70: Console.WriteLine("i ve j farklı adreste");
71: }
72: }
73: Console.ReadLine();
74: return 0;
75: }
76: }
Primitives olarak adlandırılan pek çok degisken tipi C#’da value tipi olarak kabul edilir : integer value tipi gibi. Aynı zamanda struct ile tanımlamanan user tipler’de value tipinde tanımlamalardır.
Bir sonraki makalemde görüsmek üzere
AspxGridview ve Globalization
AspxGridView dahilindeki Edit formlarda Buttonların yerini değiştirmek için ASPxGridViewTemplateReplacement yapısı önerilmekte ve kullanılmaktadır.
Örneğin :
<dxwgv:ASPxGridViewTemplateReplacement ID="UpdateButton" ReplacementType="EditFormUpdateButton" runat="server" />
Fakat bu şekilde bir kullanımda culturelarla birlikte çalışabilmek mümkün değildir. Kullandığınız bir culture yapısı mevcutsa TemplateReplacement içerisinde çalışmadığını gözlemleyebilirsiniz.
GridView için edit form captionlarına runtime’dan erişim, karşılaşabileceğiniz bu prolemi ortadan kaldırmak için önerilen ve kullanılan bir kavramdır.
Ayrıca DevXpress in de önerdiği üzere AspxGridView kendine has resource file mekanızması da kullanılabilir. (DevExpress_Web_ASPxGridView_vX_Y.resx)
Fakat bu da birden farkli resource dosyası kullanımını ve dağınıklığı getireceği için çok kullanışlı bir yapı değildir
.
Yandaki ekran görüntüsünden de görüleceği üzere AspxGridView’da en kullanışlı ve kolay yapı olarak mevcut resource dosyaları kullanılımı önerilebilir;
<SettingsText CommandCancel="<%$ Resources:SiteLabels, resourceLabel1 %>" CommandUpdate="<%$ Resources:SiteLabels, resourceLabel2 %>" />
şeklinde bir yapıyla gridview edit form yapısındaki butonların metinlerini değiştirmek mümkündür.
Burada dikkat edilmesi gereken;
Thread.CurrentThread.CurrentCulture = new CultureInfo(Culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(Culture);
değerleriyle geçerli culture i set etmektir.
.NET Framework Class Library Process.Id Property. How To Kill Process in .Net
Bugun yazmis oldugum uygulamada birseyi farkettim; uygulama algoritma olarak bir DataTable olusturuyor, ve icerideki yuklu miktarda Data’yi daha sonra Excel dosyalari olusturarak kullanicinin secmis oldugu bir path’e kaydediyor. Bunun icin algoritma son derece basit, excel servisi baslatilir, icerisindeki sheetlere datalar yazilir, ve sonra servis kapatilir. Fakat islemler bittikten sonra gordum ki Task Manager’da Process sekmesinde VS tarafindan acilan EXCEL.EXE islemleri kapatilmamis. Haliyle programin her bir execute asamasinda ordaki Process’ler kill olmadan birikiyor ve RAM tuketimini arttiriyor. Bunu manual yapacak bir kod hazirladim ce bunu sizinle paylasmak istiyorum.
Oncelikle senaryoda dikkat etmemiz gereken bir sey var. O da program sonlandiktan sonra, programin yaratmis oldugu EXCELleri sonlandirmak demek acik olan tum excelleride sonlandirmak demek oluyor. Bu yuzden izlememiz gereken yol su sekilde olmalidir:
try { // Islemler baslamadan once, varolan EXCEL.EXElerin // Process IDlerini bir liste icerisinde tutariz. // List<int> startingProcessIds = new List<int>(); // Listemizin elemanlari ornek verecek olursak 1,2, ve 3 olsun } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { // Tum islemler bittikten sonra, excel dosyalarimiz olustuktan sonra // Goruyoruz ki Task Manager'da acilan EXCEL.EXElerin sayisi artmis. // Cunku VS bu acik olanlari kapatamadi. // List<int> endingProcessIds = new List<int>(); // Tanimlamis oldugumuz listeye ayni sekilde su anki tum // Process Idleri dolduruyoruz. // Ve en son asamada iki liste arasindaki farki bularak // Ikinci listede olup, ilk listede olmayanlar bizim uygulamamiz // tarafindan yaratilmis olan EXCEL.EXEler anlamina geliyor // yazmis oldugumuz uygulamalar ile o precess idleri kill ediyoruz. }
Algoritmayi kurduktan sonra simdi gelelim kod asamasina:
1- Task Manager’da yer alan Processlerin ID’si nasil okunur?
List<string> startingProcessIds = new List<string>(); Process[] localByName = Process.GetProcessesByName("EXCEL"); int i = localByName.Length; while (i > 0) { processIds.Add(localByName[i - 1].Id.ToString()); i -= 1; }
Adini vermis oldugumuz process’e ait acik olan tum .exelerin IDleri, startingProcessIds isimli List’e dolmaktadir.Ayni islemi program finally asamasina geldiginde tekrar yapiyoruz ve bu sefer process idleri endingProcessIds isimli listeye dolduruyoruz.
2- Task Manager’da yer alan Process’in KILL edilme islemi:
Asagidaki kod blogunda endingProcessIds listesinin ilk elemaninin ID’sini aliyorum, daha sonra o ID’nin aradigim exe’ye ait olup olmadigi kontrolunu yapiyorum : chosen.ProcessName == “EXCEL”
Kontrollerden gectikten sonra, chosen.Kill() fonksiyonu ile islemi KILL ediyoruz
Process chosen;
i = localByName.Length;
while (i > 0)
{
string id = endingProcessIds[0];
if (id == "")
{
break;
}
try
{
chosen = Process.GetProcessById(Int32.Parse(id));
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
continue;
}
if (chosen.ProcessName == "EXCEL")
{
chosen.Kill();
chosen.WaitForExit();
}
i -= 1;
}
C# ile pasta tablosu oluşturma (draw pie chart)
Bu yazımda size C#’ta Graphics nesnesini kullanarak excel ve word’den aşina olduğumuz chartlardan pie chartını oluşturacağım. Bir senaryomuz olsun ve bir sınıftaki öğrencilerin aldığı notların dağılımı gösteren bir tablo oluşturalım. Bunun için Windows Form Application kullanağız.Formumuzda öğrencilerin aldığı notları uygulamaya girebileceği 5 adet textbox kontrolü ekleyelim. Bu textboxların hangi notlara ait olduğunu bildiren labellarımız olsun. Birde formumuza notları grafiğe dönüştüren ve formumuzu temizleyen 2 adet button konulduğunda formumuzun tasarımı tamamdır.
Ekran görünümü aşağıdaki gibi olacak. Sağ tarafı biraz boş bırakın o boş kısımda tablomuzu göstereceğiz.
Kod kısmına geçebiliriz.
İlk öncelikle formun load eventinde pasta dilimimizde hangi dilimlerin hangi öğrenci grubunu temsil ettiğini anlamak için textboxların arka plan rengi değiştiriyorum.
private void Form1_Load(object sender, EventArgs e)
{
textBox1.BackColor = Color.Red;
textBox2.BackColor = Color.Blue;
textBox3.BackColor = Color.Yellow;
textBox4.BackColor = Color.Green;
textBox5.BackColor = Color.Orange;
}
Daha sonra Tamam butonunun click eventinde textboxlardan sayısal değerleri alarak bunları pasta diliminde yorumlanabilir bir şekle getiriyoruz.
int not1= 0;
int not2 = 0;
int not3 = 0;
int not4 = 0;
int not5 = 0;
try
{
not1 = int.Parse(textBox1.Text);
not2 = int.Parse(textBox2.Text);
not3 = int.Parse(textBox3.Text);
not4 = int.Parse(textBox4.Text);
not5 = int.Parse(textBox5.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
float total = not1 + not2 + not3 + not4 + not5;
float deg1 = (not1 / total) * 360;
float deg2 = (not2 / total) * 360;
float deg3 = (not3 / total) * 360;
float deg4 = (not4 / total) * 360;
float deg5 = (not5 / total) * 360;
Yukarıda ki kod parçaşıyla notu 1,2,3,4,5 olan tüm öğrencileri buluyorum. Elde ettiğim sonucu total değişkenine atıyorum. Sonra 1 alan öğrencilerin sınıfın kaçta kaçını oluşturduğunu bularak 360 ile çarparak dilimdeki payını (açısal) hesaplıyor ve bir değişkene aktarıyorum. Bunu farklı not alan öğrenciler içinde uyguluyorum.
Şimdi pastamızı oluşturmaya başlıyoruz.
Pen p = new Pen(Color.Black, 1);
Graphics g = this.CreateGraphics();
Rectangle rec = new Rectangle(textBox1.Location.X + textBox1.Size.Width + 10, 12, 150, 150);
Brush b1 = new SolidBrush(Color.Red);
Brush b2 = new SolidBrush(Color.Blue);
Brush b3 = new SolidBrush(Color.Yellow);
Brush b4 = new SolidBrush(Color.Green);
Brush b5 = new SolidBrush(Color.Orange);
g.Clear(Form1.DefaultBackColor);
g.DrawPie(p, rec, 0, deg1);
g.FillPie(b1, rec, 0, deg1);
g.DrawPie(p, rec, deg1, deg2);
g.FillPie(b2, rec, deg1, deg2);
g.DrawPie(p, rec, deg2 + deg1, deg3);
g.FillPie(b3, rec, deg2 + deg1, deg3);
g.DrawPie(p, rec, deg3 + deg2 + deg1, deg4);
g.FillPie(b4, rec, deg3 + deg2 + deg1, deg4);
g.DrawPie(p, rec, deg4 + deg3 + deg2 + deg1, deg5);
g.FillPie(b5, rec, deg4 + deg3 + deg2 + deg1, deg5);
İlk önce pasta dilimlerini birbirinden ayıran çizgimizi Pen ile rengi siyah ve kalınlığı 1 px olacak şekilde oluşturduk.Graphics ise çizimi oluşturacak metodları içerir. Rectangle, pasta tablomuzun formun hangi koordinatlarda ve hangi büyüklükte olucağını belirler. Bizim örneğimizde x koordinatı “textBox1.Location.X + textBox1.Size.Width + 10” olarak ayarlanmıştır. Böylece grafiğimizin textboxların yanında çıkmasını sağladık. Daha sonra Brush yardımıyla pasta dilimlerimizi renklendirmede kullanacağımız renkleri Brush tipindeki değişkenlere aktardık.
Graphics’in bize sunduğu metodlardan biri olan g.Clear() metoduyla grafiğimizi işlemlere başlamadan siliyoruz. Burada gördüğümüz ikinci metod olan g.DrawPie() ile ilk pasta dilimimizi oluşturuyoruz. Bu metodun içerisine oluşturduğumuz pen tipindeki değişkenimiz olan p yi, rectangle tipindeki değişkeninimizi, çizime başlıyacağı başlangıç açısını ve son olarak oluşturacağımız pasta açısını veriyoruz. g.FillPie() metoduyla ile farklı olarak sadece Brush ile pasta dilimimize renk veriyoruz. Ama dikkat edilmesi gereken şey g.DrawPie ve g.FillPie metodlarında başlangıç açısı “0” ile başlar ve oluşturulan herbir dilim kendinden önceki dilim ve dilimlerin açısının toplamı, başlangıç açısını oluşturur.
Programımızı artık deneyebiliriz.
ASP.Net Samples – Part III: System.Net.Mail with ASP.Net
5 – System.Net.Mail ile Mail Send
Merhaba arkadaslar, bugun sizlere ASP.Net uzerinden Mail gonderme islemi uzerine ornek yapacagiz. Gunumuzde E-Mail yapisi bilmeyen pek az insan vardir sanirim. E-Mail, dunya capinda Bireysel ve Kurumsal olarak kullanilan bir yapidir. Bireysel kullanimlara ornek vermek istersek eger cok yaygin olan mail servislerinden ornek verebiliriz (gmail,hotmail,yahoo gibi). Kurumsal kullanimlarda genelde Microsoft Exchange Server tercih edilir. Exchange serverdan bahsetmek isterdim ama off topic olmamak adina bahsetmesem iyi olur. Gelelim mail gonderme islemini kendi yarattigimiz bir .aspx veya Windows Application uzerinden yapmaya. 2 yapi arasinda pek bir fark oldugu soylenemez acikcasi. Oncelikle bu islemi yapabilmek icin sahip oldugunuz mail adresinizi bir takim bilgilerine ihtiyac duyarsiniz. SMTP, Incoming – Outgoing adresleri gibi. Kendinize ozel bir isim hakki ve domaininiz var ise bu is daha kolay tabi. Ornek vermek gerekirse sahip oldugum www.serkanhekimoglu.com ismi, ve barindirdigim serverimin saglamis oldugu avantajlar dogrultusunda kendi alan adim uzantisinda mail adresi olusturabiliyor. (serkan@serkanhekimoglu.com) gibi. Incoming ve Outgoing bilgilerimde haliyle mail.serkanhekimoglu.com oluyor. Gelelim simdi bunu form uzerinde nasil yapacagimiza.
Isleme baslamak icin bir adet .aspx sayfasi olusturalim, ve .Net’in mail gonderme yapisini kullanabilmek icin gerekli referanslari ekleyelim :
using System.Net.Mail;
using System.Net;
Mail gonderim sirasinda ki islemi basitce dusunecek olursak eger, Mesajimiz, gonderen, alici, konu, ve ana mesajdan olusur. Bunlara ek olarakdan CC, BCC, veya Attachment gibi olaylarda mevcuttur. Dolayisiyla bu degerleri cekebilecegimiz textBoxlari .aspx sayfamiza ekleyelim. Ve gelen kod kismina:
MailAddress From = new MailAddress(txtEmailAddress.Text.ToString(),
txtName.Text.ToString() + " " +
txtSurname.Text.ToString());
MailAddress To = new MailAddress("serkan@serkanhekimoglu.com");
MailMessage Email = new MailMessage(From, To);
Email.IsBodyHtml = true;
Email.Subject = "Message From Serkanhekimoglu.com";
Email.Body = txtMessage.Text.ToString();
SmtpClient MailClient = new SmtpClient();
MailClient.Host = "mail.serkanhekimoglu.com";
MailClient.UseDefaultCredentials = false;
MailClient.Credentials = new
NetworkCredential("serkan@serkanhekimoglu.com", "MAILSIFRENIZ"); MailClient.Port = 26; MailClient.Send(Email);
MailAddress’i biraz kurcalayacak olursaniz CC ve BCC gibi ozellikleride gorebilirsiniz. Burda sorun yaratabilecek tek sey Mail’in cikis port’u olabilir. Default port kullanilir veya manuel olarak cikis portu belirtilebilir. To kismini ister textbox’tan okursunuz ister kendiniz default bir mail adresi set edersiniz. (sekildeki gibi)
XML Serialization – How to do XML Serialization?
Merhaba arkadaslar, bu makalede sizlerle daha onceden uzerinde durmus oldugumuz Serialization konusunu kullanaraktan, Serialize edilmis XML dosyasi yaratacagiz.
Serialization işlemi, son durumlarını korumak istediğimiz nesnelerin, hiçbir veri kaybına uğramadan, geçici olarak hafızada veya kalıcı olarak bir dosyada saklanmasıdır. Bu dosya tipi XML veya binary olabilir. Bunlar her ortamdan kolayca erişilebilen basit dosya tipleridir. Bu yontem ile cok buyuk miktardaki verilere ulasabiliriz, transfer edebiliriz. Ve baska kullanicilarinda kullanimina acabiliriz.
Uygulamayi yapmak icin oncelikle WindowsApplication Projesi olusturuyoruz. Bu ornekte herhangi UI kullanmayacagiz, ve herseyi FormLoad’da yapacagiz. Oncelikle ornegimizden bahsedelim. Bir adet Insan class’i olusturacagiz, ve insan class’ini kullanaraktan bir kisi olusturup, bilgilerini local diskimizde saklayacagiz (Tabi bu sizin isteginize bagli, isterseniz database’de saklayip baska kullanicilarin kullaniminada acabilirsiniz)
[Serializable()]
public class Insan
{
private int TcKimlikNo_;
public int TcKimlikNo
{
get { return TcKimlikNo_; }
set { TcKimlikNo_ = value; }
}
private string AdSoyad_;
public string AdSoyad
{
get { return AdSoyad_; }
set { AdSoyad_ = value; }
}
[NonSerialized(),System.Xml.Serialization.XmlIgnore()]
private int SosyalGuvenlikNo_;
public int SosyalGuvenlikNo
{
get { return SosyalGuvenlikNo_; }
set { SosyalGuvenlikNo_ = value; }
}
public override string ToString()
{
return this.TcKimlikNo_ + " - " + this.AdSoyad_;
}
[System.Runtime.Serialization.OnDeserialized()]
protected void DeserializeLog(System.Runtime.Serialization.StreamingContext sc)
{
// Loglama Kodlari.
MessageBox.Show("Deserialize Edildi !");
}
[System.Runtime.Serialization.OnSerialized()]
protected void SerializeLog(System.Runtime.Serialization.StreamingContext sc)
{
// Loglama Kodlari.
MessageBox.Show("Serialize Edildi !");
}
}
Bu noktada en onemli olan sey, classinizi tanimlarken bu classin Serialize edilebilmesi icin uste ekledigimiz [Serializable()] textidir.
Simdi gecelim FormLoad kodlarimizia.
private void FormXmlSerialization_Load(object sender, EventArgs e) { System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization. XmlSerializer(typeof(Insan)); Insan ins = new Insan(); ins.AdSoyad = "Serkan Hekimoglu"; ins.SosyalGuvenlikNo = 1234567; ins.TcKimlikNo = 2938475; System.IO.FileStream fs = new System.IO. FileStream("G:\\Insan.xml", System.IO.FileMode.OpenOrCreate); xs.Serialize(fs, ins); fs.Close(); }
How To Use File Stream in .Net? Deflate Stream. File Stream kullanimi.
Merhaba arkadaslar, bu makalemizde size File Streaming hakkinda biraz bilgi verecegim. Kullanim sekli, amaci gibi, ve File Stream kullanarak sizinle dosya sikistirma programi hazirlayacagim ( Zip – Unzip Programi).
Yapmak istedigimiz islem .Net 2.0 ile gelmis olan GZip Streaming islemidir. Bu sınıf streamleri sıkıştırmak ve sıkıştırılmış streamleri geri açmak için metotlar ve özellikler sağlıyor. DeflateStream sınıfıyla beraber System.IO.Compression isim alanında bulunuyor. GZip stream Stream sinifindan turemektedir. Gzip veri formatimizi Deflatestream ile ayni algoritmayi kullanmaktadir. Fakat Gzip algoritmasi, boyutu 4 GB den buyuk dosyalarda islevini yitirmektedir. DeflateStream ve Gzip Stream fonksiyonlarinin sikistirma ozelligi aciga stream cikartir. MSDN’den belirtildigi uzere bu algoritmalar sikistirilmamis dosyalar icin en iyisidir. Aksi takdirde sikistirilmis bir dosyayi bu algoritmalari kullanaraktan sikistirmaya calisirsaniz, dosya boyutunda artisa sebep olabilirsiniz. Yapmak istedigimiz Compression ve Decompression ornegimizde System.IO.Compression adi altinda bulunun DeflateStream algoritmasini kullanacagiz.
Oncelikle uygulamamiza baslarken, bir adet DeflateStreamSamples isimli Windows Application Projesi olusturuyoruz. Ilk olarak sikistirma islemi yapacagiz. Bunun icin asagidaki gibi bir UI olusturalim, ve ekranimiza Open File Dialog ekleyelim.
Text Box = txtFileName
Dosya Sec Button = selectFileButton
Check Box = chkDelete
Sikistir Button = zipButton
Dosya Sec Buttonumuzun Click eventinde, eklemis oldugumuz Open File Dialog’u kullaniyoruz.
private void selectFileButton_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { txtFileName.Text = openFileDialog1.FileName; } }
Sikistir Button’umuzun click eventinde asagidaki kodlari uyguluyoruz.
private void zipButton_Click(object sender, EventArgs e) { if (txtFileName.Text.EndsWith(".srk")) { MessageBox.Show("Bu Dosya Zaten Sıkıştırılmış", "", MessageBoxButtons.OK, MessageBoxIcon.Error); this.Close(); } if (txtFileName.Text != string.Empty) { System.IO.FileStream fsSonuc = new System.IO. FileStream(txtFileName.Text + ".srk", System.IO.FileMode.OpenOrCreate); System.IO.Compression.DeflateStream ds = new System.IO.Compression. DeflateStream(fsSonuc, System.IO.Compression.CompressionMode.Compress); System.IO.FileStream fsHedef = new System.IO. FileStream(txtFileName.Text, System.IO.FileMode.OpenOrCreate); byte[] OkunanData = new byte[fsHedef.Length]; byte[] YazilacakData = new byte[fsHedef.Length]; fsHedef.Read(YazilacakData, 0, YazilacakData.Length); ds.Write(YazilacakData, 0, YazilacakData.Length); // Boyutunu Kaydediyoruz : System.IO.File.WriteAllText(txtFileName.Text + ".srk.info", fsHedef.Length.ToString()); ds.Close(); fsHedef.Close(); fsSonuc.Close(); if (chkDelete.Checked) { System.IO.File.Delete(txtFileName.Text); System.IO.File.Delete(txtFileName.Text + ".info"); } MessageBox.Show("Zip process has been completed.", "", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("Please Select File for Zip", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
Buradaki olay akisini ozetlemek gerekirse. Secilen bir dosyayi sikistiriyoruz, ve .srk uzantili olarak kaydediyoruz.Dosyamizin
boyutunuda .srk.info olarak sisteme kaydediyoruz. Ilk basta kullanmis oldugumuz if kontrolu icinde yer alan kod, messagebox’tanda anlayacaginiz uzere sikistirilmis
olan bir dosyanin, tekrar sikistirilmasini onlemek amacli yazilmistir. Yukarida da bahsettigim gibi, sikistirilmis bir dosyayi tekrar sikistirmak,
dosya boyutunda artisa yol acabilir. UI’da kullandigimiz checkBox’un islevini aciklamak gerekirse: Sikistirma isleminde eger checkBox’i secerseniz, sikistirdiginiz dosyanin orjinali silinir, ve sikistirilmis hali sistemde tutulur. Secmediginiz takdirde, hem orjinal dosya, hemde sikistirilmis dosya sistemde tutulur. Burda sikistirlan dosya, orjinal dosya ile ayni Path’de tutulur. Sikistirma sonucu 2 dosya olusur. Bunlar .srk ve .srk.info uzantili dosyalardir. 2. dosyada orjinal dosyamizin boyutu saklanmaktadir.
Sirada yukarida yaptigimiz islemin tam tersi var (DeCompression). DeCompression islemi icinde asagidaki benzer UI tasarimini yapalim, ve Open File Dialog ekleyelim.
Text Box = txtFileName
Dosya Sec Button = selectFileButton
Check Box = chkDelete
UnZip Button = unzipButton
Dosya Sec Buttonumuzun click eventinde asagidaki kodlari uygulayalim.
private void selectFileButton_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { txtFileName.Text = openFileDialog1.FileName; } }
Unzip Buttonumuzun click eventinde asagidaki kodlari uyguluyoruz.
private void unZipButton_Click(object sender, EventArgs e) { if (txtFileName.Text != string.Empty && txtFileName.Text.EndsWith(".srk")) { System.IO.FileStream fsAcilacak = new System.IO. FileStream(txtFileName.Text, System.IO.FileMode.OpenOrCreate); System.IO.Compression.DeflateStream ds = new System.IO.Compression. DeflateStream(fsAcilacak, System.IO.Compression.CompressionMode.Decompress); System.IO.FileStream fsSOnuc = new System.IO. FileStream(txtFileName.Text.Remove(txtFileName.TextLength - 4), System.IO.FileMode.OpenOrCreate); byte[] AcilmisData = new byte[Convert.ToInt64(System.IO.File.ReadAllText(txtFileName.Text + ".info"))]; ds.Read(AcilmisData, 0, AcilmisData.Length); fsSOnuc.Write(AcilmisData, 0, AcilmisData.Length); fsAcilacak.Close(); ds.Close(); if (chkDelete.Checked) { System.IO.File.Delete(txtFileName.Text); System.IO.File.Delete(txtFileName.Text + ".info"); } MessageBox.Show("UnZip process has been completed. Check your file at same path !", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { MessageBox.Show("Please Select File for UnZip", "", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }
Yukarida islemi ozetlemek gerekirse, sikistirilmis dosyamiz olan .srk uzantili dosyayi sisteme okutuyoruz, burdaki checkBox’imizin islevi, sikistirilmis dosyayi orjinal haline cevirdikten sonra, kalan .srk ve .srk.info uzantili dosyalari silmek icindir. Isaretlemediginiz takdirde, islem sonunda sistemde 3 dosya olur. Orjinal dosya, .srk ve .srk.info uzantili dosya.
How To Use Ternery Operator – Ternery Operator nasil kullanilir?
Ternery Operatoru’nun kullanim amaci .Net’te tek satirlik if-else kosulunu ve sonuclarini gostermektir.
Ornegin, MessageBox’da bir text’in value’sini gosterecegiz. Eger textBox’a bir deger girilmemisse, yani string.Empty ise “Bir Deger Girin.”, degilse textBox.Text’i ekrana bastiracagiz. Bunun icin ornek kod blogu asagidaki gibidir.
private void button1_Click(object sender, EventArgs e) { string message = textBox1.Text == string.Empty ? "Bos" : textBox1.Text; MessageBox.Show(message); }
Buraki olayi ozetlemek gerekirse; message degiskenini bir baska degiskene esitliyoruz. Bu esitledigimiz degiskende, bir kosulumuz var. Kullanacagimiz arac textbox oldugundave if-else kosullarimizda Eger textbox.text bos ise X islemini yap, degil ise Y islemini yap. Esitlikten sonraki textBox1.Text == string.Empty, ifadesi bize Boolean sonuc dondurecektir. Hemen ardindan kullanilan ? simgesi Boolean sonucun True donmesi durumunda uygulanacak islemdir. Sonucun False donmesi sonucunda : sembolunden sonra gelen kod isleme alinir. Yani Eger True ise ? durumu, degil ise : sonrasindaki durum uygulanir.
Dec 29 2009 Binary Formatter : Serialization / Deserialization
Merhaba arkadaslar, bugun Binary Serialization ve Deserialization uzerine ornek yapacagiz. Peki Serialization nedir? ve neden kullanilir?
Serialization işlemi, son durumlarını korumak istediğimiz nesnelerin, hiçbir veri kaybına uğramadan, geçici olarak hafızada veya kalıcı olarak bir dosyada saklanmasıdır. Bu dosya tipi XML veya binary olabilir. Bunlar her ortamdan kolayca erişilebilen basit dosya tipleridir. Bu yontem ile cok buyuk miktardaki verilere ulasabiliriz, transfer edebiliriz. Ve baska kullanicilarinda kullanimina acabiliriz.
Uygulamayi yapmak icin oncelikle WindowsApplication Projesi olusturuyoruz. Bu ornekte herhangi UI kullanmayacagiz, ve herseyi FormLoad’da yapacagiz. Oncelikle ornegimizden bahsedelim. Bir adet Insan class’i olusturacagiz, ve insan class’ini kullanaraktan bir kisi olusturup, bilgilerini local diskimizde saklayacagiz (Tabi bu sizin isteginize bagli, isterseniz database’de saklayip baska kullanicilarin kullaniminada acabilirsiniz)
[Serializable()]
public class Insan
{
private int TcKimlikNo_;
public int TcKimlikNo
{
get { return TcKimlikNo_; }
set { TcKimlikNo_ = value; }
}
private string AdSoyad_;
public string AdSoyad
{
get { return AdSoyad_; }
set { AdSoyad_ = value; }
}
[NonSerialized(),System.Xml.Serialization.XmlIgnore()]
private int SosyalGuvenlikNo_;
public int SosyalGuvenlikNo
{
get { return SosyalGuvenlikNo_; }
set { SosyalGuvenlikNo_ = value; }
}
public override string ToString()
{
return this.TcKimlikNo_ + " - " + this.AdSoyad_;
}
[System.Runtime.Serialization.OnDeserialized()]
protected void DeserializeLog(System.Runtime.Serialization.StreamingContext sc)
{
// Loglama Kodlari.
MessageBox.Show("Deserialize Edildi !");
}
[System.Runtime.Serialization.OnSerialized()]
protected void SerializeLog(System.Runtime.Serialization.StreamingContext sc)
{
// Loglama Kodlari.
MessageBox.Show("Serialize Edildi !");
}
}
Bu noktada en onemli olan sey, classinizi tanimlarken bu classin Serialize edilebilmesi icin uste ekledigimiz [Serializable()] textidir.
Simdi gecelim FormLoad kodlarimizia.
private void Form1_Load(object sender, EventArgs e) { // Serialization System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); Insan ins = new Insan(); ins.AdSoyad = "Serkan Hekimoglu"; ins.TcKimlikNo = 123456789; System.IO.FileStream fs = new System.IO.FileStream("C:\\InsanObjesi.ins", System.IO.FileMode.OpenOrCreate); bf.Serialize(fs, ins); fs.Close(); }
Formu Run ettigimizde insan classini kullanaraktan bir insan olusturuyoruz, bu insana manuel olarak isim ve tckimlik no degerleri atiyoruz, ve File Streaming kullanaraktan localimie .ins uzantili bir dosya Serialize edilmis bir dosya olusturuyoruz. Loglama kodlarini kullanarak, ekrandan son durumu ogreniyoruz.
Local klasorumuzu kontrol ettigimizde InsanObjesi.ins isimli Serialize edilmis obje iceren bir dosya goruyoruz.
Simdi sirada bu dosyanin icerigini okuyarak kullaniciya gosterme kismi var (Deserialize).
Bu sefer formLoad daki kodlarimizi su sekilde degistiyoruz.
private void Form1_Load(object sender, EventArgs e) { // DeSerialization System.IO.FileStream fs = new System.IO.FileStream( "I:\\InsanObjesi.ins", System.IO.FileMode.OpenOrCreate); Insan ins = null; if (fs.Length > 0) { ins = bf.Deserialize(fs) as Insan; MessageBox.Show(ins.ToString()); } fs.Close(); }
Burda onemli olan sey, dosyamizin bulundugu path’i dogru bir sekilde programa gostermektir. Bu kodlardan sonra programi run ettigimiz zaman, program path’i verilen yere gider Insanobjesi.ins isimli dosyayi File Streaming kullanarak acar ve icindeki Serialize edilmis veriyi Deserialize eder.
Hepsi bu kadar. Binary formatter sayesinde, cok yuksek boyutlara ulasan verilerinizi hizli bir sekilde okuyabilir, paylasabilirsiniz. Database’e insert edip. diger kullanicilarin erisimine acabilirsiniz.












