Arşiv

Etiketlenen yazılar file

Windows 8 Metro Style ilk uygulamamız

07 Ekim 2011 Yorum yapılmamış

Windows 8 Programlama makalelerinde ilk uygulamamızı geliştirmeye başlıyoruz.

Windows 8 Başlangıç Ekranımızda (Start Screen) Visual Studio 2011 üzerine tıklayarak, yeni bir Visual Studio 2011 başlatıyoruz.

File / New / Project menüsünden Windows Metro Style kategorisindeki Application proje şablonunu seçiyoruz ve MetroStyleIlkUygulama ismini vererek projemizi oluşturuyoruz.

Proje oluşturulduğunda Visual Studio 2011 varsayılan olarak MainPage.xaml dosyasını açıyor. Uygulamamızın başlangıç ekranı varsayılan olarak MainPage.xaml dosyasıdır.

Grid elementi içerisine bir button, bir de label eklemek için aşağıdaki satırları yazıyoruz;

<Button Content="Mesaj Göster" FontSize="28" Width="250" Height="80" HorizontalAlignment="Center" />
<TextBlock x:Name="MessageText" FontSize="48" Foreground="White" />

WPF ve Silverlight‘ta Label nesnesi oluşturmak için TextBlock nesnesi kullanmamız gerekiyor. Bu elementler ile ekranımıza Mesaj Göster metinli bir button ve metin içermediği için ekranda gözükmeyen bir textblock nesnesi koymuş olduk.

Fakat bu kontrolleri ekranda ortalayabilmek için bir StackPanel içerisine koymamız gerekiyor;

<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
	<Button Content="Mesaj Göster" FontSize="28" Width="250" Height="80" HorizontalAlignment="Center" />
	<TextBlock x:Name="MessageText" FontSize="48" Foreground="White" />
</StackPanel>

StackPanel ve Button elemanlarına verdiğimiz Alignment özellikleri sayesinde elemanları ekranda ortalıyoruz.

Son olarak Button element’imize

Click="Button_Click"

özelliğini ekleyelim. Böylece butona tıklanma event‘i ile tetiklenen bir method‘umuz oluyor.

MainPage.xaml.cs dosyasına;

private void Button_Click(object sender, RoutedEventArgs e)
{
	MessageText.Text = "Windows 8 üzerinde çalışan\r\nilk uygulamamız!!";
}

method’unu ekliyoruz.

Son olarak F5 tuşuna basarak projeyi test amaçlı çalıştırıyoruz. Uygulama açılışında ilk önce bekleme ekranı ekrana geliyor.

Fakat çok kısa süre içerisinde ilk ekranımız açılıyor.

Butona tıkladığımızda TextBlock metin ile doluyor.

Kodların tamamı;

<UserControl x:Class="MetroStyleIlkUygulama.MainPage"
	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
	mc:Ignorable="d"
	d:DesignHeight="768" d:DesignWidth="1366">

<Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
	<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
		<Button Content="Mesaj Göster" FontSize="28" Width="250" Height="80" HorizontalAlignment="Center" Click="Button_Click" />
		<TextBlock x:Name="MessageText" FontSize="48" Foreground="White" />
	</StackPanel>
</Grid>

</UserControl>

Bu kodda ne yanlış var? – 9

20 Ağustos 2011 9 yorum

Geliştirmekte olduğumuz bir projede C:\ sürücüsünde bulunan OnemliDosya.xls dosyasını sıkışırmamız ve OnemliDosya.zip dosyasını oluşturmamız istendi.

Hemen arkasından sıkıştırdığımız dosyayı açmamız ve OnemliDosya.Yeni.xls dosyasını oluşturmamız bekleniyor.

Aşağıdaki method’ları bu görev için yazdık;

public static void Compress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream InputStream = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream OutputStream = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(OutputStream, CompressionMode.Compress);

	try
	{
		byte[] Buffer = new byte[InputStream.Length];
		InputStream.Read(Buffer, 0, Buffer.Length);
		ZipStream.Write(Buffer, 0, Buffer.Length);
	}
	finally
	{
		OutputStream.Close();
		InputStream.Close();
	}
}

public static void Decompress(string ZiplenecekDosyaAdi, string ZipDosyaAdi)
{
	FileStream Input = File.Open(ZiplenecekDosyaAdi, FileMode.Open);
	FileStream Output = File.Open(ZipDosyaAdi, FileMode.Create);
	GZipStream ZipStream = new GZipStream(Input, CompressionMode.Decompress);

	try
	{
		int Data = ZipStream.ReadByte();
		while (Data > 0)
		{
			Output.WriteByte((byte)Data);
			Data = ZipStream.ReadByte();
		}
	}
	finally
	{
		Output.Close();
		Input.Close();
	}
}

Yazdığımız method’ları aşağıdaki gibi kullanıyoruz;

Compress("C:\\OnemliDosya.xls", "C:\\OnemliDosya.zip");
Decompress("C:\\OnemliDosya.zip", "C:\\OnemliDosya.Yeni.xls");

Kodumuzdan emin olmamıza rağmen, çalışmadığını farkediyoruz.

Sizce problem nedir ve nasıl düzeltilebilir?

C# ile Geçici Dosya (Temporary File) oluşturma sınıfı yazalım

13 Temmuz 2011 Yorum yapılmamış

Projelerimizde dosya sistemi üzerinde geçici olarak dosya oluşturma ve işimiz bittiğinde silme ihtiyacı hissedebiliriz.

Bu yazıyı okumadan önce Hem benzersiz hem de geçici dosya oluşturmanın en kolay yolu ve C# ile Geçici Dosya Oluşturmak başlıklı yazılarımı okumanızı öneririm.

Bu linkte bulduğum yöntemi çok kullanışlı buldum ve sizler (aynı zamanda kendim) için türkçeleştirdim;

public class TempFile : IDisposable
{
	public TempFile() : this(string.Empty)
	{ }

	private readonly string _tmpfile;

	public TempFile(string extension)
	{
		_tmpfile = Path.GetTempFileName();

		if (!string.IsNullOrEmpty(extension))
		{
			string newTmpFile = _tmpfile + extension;

			/// Yeni bir geçici dosya oluşturulur
			File.Create(newTmpFile, 0);
			/// Eski geçici dosya silinmediyse, silinir.
			File.Delete(_tmpfile);

			/// Yeni oluşturulan geçici dosya kullanıma hazır!
			_tmpfile = newTmpFile;
		}
	}

	public string FullPath
	{
		get { return _tmpfile; }
	}

	void IDisposable.Dispose()
	{
		if (!string.IsNullOrEmpty(_tmpfile) && File.Exists(_tmpfile))
		{
			File.Delete(_tmpfile);
		}
	}
}

Kullanımına örnek;

using(TempFile tmp = new TempFile(".dat")) /// dat uzantılı bir geçici dosya oluşturuluyor
{
	/// FullPath özelliğinden geçici dosyanın yolu ve dosya adı alınabilir;
	string filename = tmp.FullPath;
}

Dosya uzantısını uygulamanız ile ilişkilendirin

30 Eylül 2010 1 yorum

Bir windows uygulaması geliştirdiniz ve uygulamanız belli uzantıdaki dosyalar üzerinde işlemler gerçekleştiriyor (Görüntüleme, Kaydetme, vs.)

Eğer ilgili uzantıdaki dosyaya çift tıklandığı zaman uygulamanızın açılmasını ve dosya üzerinde işlem yapmasını istiyorsanız, öncelikle dosya uzantısı ve uygulamanızı registry üzerinden birbiri ile ilişkilendirmelisiniz.

Aşağıdaki örnek kod sayesinde, eng uzantılı dosyaların uygulamanız ile ilişkilendirilmesini ve dosya ikonlarının sizin belirlediğiniz (icon.ico) olarak gözükmesini sağlayabilirsiniz;

Registry.ClassesRoot.CreateSubKey(".eng").SetValue(null, "EnginDosyasi.eng");

RegistryKey rk = Registry.ClassesRoot.CreateSubKey("EnginDosyasi.eng");
rk.CreateSubKey("DefaultIcon").SetValue(null, Application.StartupPath + "\\icon.ico");
rk.CreateSubKey(@"shell\open\command").SetValue(null, "\"" + Application.ExecutablePath + "\" \"%1\"");

eng uzantılı bir dosyaya çift tıklandığında artık sizin uygulamanız açılacaktır.

Çift tıklandığı için uygulamanızı açtıran dosyaya, aşağıdaki kod satırı ile ulaşabilirsiniz;

public static void Main(string[] args)
{
	string Dosya = args[1];
}

C# Windows tarzı dosya boyutu formatlayıcı

04 Eylül 2010 Yorum yapılmamış

Eğer uygulamalarınızda dosya sistemindeki dosyalar veya dizinler ile uğraşıyorsanız (listeleme, filtreleme, vs.) büyük ihtimalle dosya veya dizinlerin boyutlarını hespalayan bir yönteminiz vardır.

Genellikle (kolay olduğundan ötürü) byte cinsinden dosya boyutunu 1000′e (bin) böler kilobyte cinsinden veya 1.000.000′a (milyon) böler megabyte cinsinden karşılığını buluruz.

Fakat Windows işletim sisteminde dosya veya dizinlerin boyutları en yakın birime göre hesaplanır ve gösterilir.

Küçük dosyalar byte, kilobyte veya megabyte cinsinden gösterilirken, daha büyük dosyalar gigabyte hatta terabyte cinsinden gösterilebiliyor.

Eğer biz de uygulamamızda dosya boyutlarını Windows tarzında göstermek istiyorsak, öncelikle birimleri elde etmemize yarayacak bir enum tanımlamalıyız;

public enum Boyutlar
{
	byte,
	kilobyte,
	megabyte,
	gigabyte,
	terabyte,
	petabyte
}

Daha sonra, parametre olarak noktalı rakam alan, geriye string döndüren bir method tanımlamalıyız;

public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
{
}

FormatDosyaBoyutu method’unda, önce Boyutlar enum‘ından bir örnek oluşturacağız ve byte değerini içermesini sağlayacağız;

Boyutlar BoyutTanim = Boyutlar.byte;

Daha sonra bir döngü aracılığıyla, DosyaBoyutu değişkeni 1000′e bölünebildiği sürece BoyutTanim değişkeninin bir üst birimi içermesini sağlayacağız;

while (Math.Round(DosyaBoyutu) >= 1000)
{
	DosyaBoyutu /= 1024;
	BoyutTanim++;
}

Son olarak, method’dan geriye DosyaBoyutu değişkenin virgülden sonra 2 hane içeren ve doğru birimi gösteren değeri döndürmesini sağlayacağız;

return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);

Dosya Boyutu Formatlayıcı

Örnek kodun tamamı;

using System;
using System.Text;

namespace DosyaBoyutuFormatlayici
{
	class Program
	{
		public enum Boyutlar
		{
			byte,
			kilobyte,
			megabyte,
			gigabyte,
			terabyte,
			petabyte
		}

		public static void Main(string[] args)
		{
			Console.WriteLine(FormatDosyaBoyutu(0));
			Console.WriteLine(FormatDosyaBoyutu(10));
			Console.WriteLine(FormatDosyaBoyutu(200));
			Console.WriteLine(FormatDosyaBoyutu(3000));
			Console.WriteLine(FormatDosyaBoyutu(40000));
			Console.WriteLine(FormatDosyaBoyutu(500000));
			Console.WriteLine(FormatDosyaBoyutu(6000000));
			Console.WriteLine(FormatDosyaBoyutu(70000000));
			Console.WriteLine(FormatDosyaBoyutu(800000000));
			Console.WriteLine(FormatDosyaBoyutu(9000000000));
			Console.WriteLine(FormatDosyaBoyutu(10000000000));
			Console.WriteLine(FormatDosyaBoyutu(200000000000));
			Console.WriteLine(FormatDosyaBoyutu(3000000000000));
			Console.WriteLine(FormatDosyaBoyutu(40000000000000));
			Console.WriteLine(FormatDosyaBoyutu(500000000000000));
			Console.WriteLine(FormatDosyaBoyutu(6000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(70000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(800000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(9000000000000000000));
			Console.WriteLine(FormatDosyaBoyutu(10000000000000000000));

			Console.ReadLine();
		}

		public static string FormatDosyaBoyutu(decimal DosyaBoyutu)
		{
			Boyutlar BoyutTanim = Boyutlar.byte;

			while (Math.Round(DosyaBoyutu) >= 1000)
			{
				DosyaBoyutu /= 1024;
				BoyutTanim++;
			}

			return string.Format("{0}\t{1}", DosyaBoyutu.ToString("f2"), BoyutTanim);
		}
	}
}

Hem benzersiz hem de geçici dosya oluşturmanın en kolay yolu

07 Mart 2010 1 yorum

Geliştirdiğiniz bir uygulamada, geçici bir dosyaya ihtiyacınız olduğunu düşünelim. Ama daha önce oluşturulmuş bir dosyanın ismini vermediğinizden emin olmak istiyorsunuz.

  • Kullanıcının geçici dosyaları hangi dizinde tuttuğunu bulmak
  • Rastgele bir dosya ismi üretmek, eğer bu dosya isminde bir dosya varsa, yeni bir dosya ismi bulana kadar rastgele yeni dosya ismi üretmek
  • Ürettiğiniz rastgele isme sahip yeni bir dosya oluşturmak

adımlarını gerçekleştirmek yerine, Path.GetTempFileName() method’unu kullanabilirsiniz.

string GeciciDosya = Path.GetTempFileName(); /// GeciciDosya değişkeni kullanıcının Temp dizininde 0-byte boyutlu bir dosyanın tam dosya yolunu içerir.

using (StreamWriter sw = File.OpenText(GeciciDosya))
{
	sw.WriteLine("Geçici Dosyaya yazılacak bilginin ilk satırı");
}

Benim kullandığım bilgisayarda, Path.GetTempFileName() methodu geriye “C:\Documents and Settings\EnginPolat\Local Settings\Temp\tmp3A.tmpstring değeri döndürdü.

Eğer rastgele dosyanın gerçekten oluşturulmasını değil, sadece dosya isminin üretilmesini istiyorsanız; Path.GetRandomFileName() methodunu kullanabilirsiniz;

string DosyaAdi = Path.GetRandomFileName(); /// DosyaAdi değişkeni sadece rastgele bir dosya ismini içerir.

Benim bilgisayarımda, Path.GetRandomFileName() methodu geriye “z4a2sa4a.49estring değeri döndürdü.

FileStream sınıfına Kaydet() ExtensionMethod’u yazalım

01 Mart 2010 Yorum yapılmamış

FileStream sınıfına yazacağımız Save() method’u sayesinde, aşağıdaki kodu kolaylıkla yazabilir olacağız. Üstelik bir tane de overload yazarak, varolan dosyanın üstüne yazmasını engelleyip, yeni bir dosya adı oluşturup yazma işlemine devam ettirebileceğiz.

fs.Kaydet("c:\\dosya_adi.uzanti");

Eğer aynı kodu, ikinci bir boolean parametreye true değeri vererek çağırırsak, klasörde dosya_adi.uzanti dosyası varsa dosya_adi[1].uzanti dosyasına yazmayı deneyecek, eğer bu dosya da varsa, dosya_adi[2].uzanti dosyasına deneyecek, vs..

fs.Kaydet("c:\\dosya_adi.uzanti", true);

İşte kodumuz;

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string Kaydet(this FileStream Dosya, string Dizin)
		{
			return Dosya.Kaydet(Dizin, false);
		}

		public static string Kaydet(this FileStream Dosya, string Dizin, bool UstuneYaz)
		{
			int DosyaSayac = 1;

			string _Dizin = Path.GetDirectoryName(Dizin);

			if (!Directory.Exists(_Dizin))
				Directory.CreateDirectory(_Dizin);

			int DosyaBoyu = Convert.ToInt32(Dosya.Length);
			string DosyaAdi = Path.GetFileName(Dosya.Name);

			Byte[] b = new Byte[DosyaBoyu];
			Dosya.Read(b, 0, DosyaBoyu);

			string root = Path.GetDirectoryName(Dizin) + "\\" + Path.GetFileNameWithoutExtension(Dizin);

			while (!UstuneYaz && File.Exists(Dizin))
				Dizin = root + "[" + DosyaSayac++.ToString() + "]" + Path.GetExtension(Dizin);

			File.WriteAllBytes(Dizin, b);

			return Path.GetFileName(Dizin);
		}
	}
}

C# ile Geçici Dosya Oluşturmak

18 Şubat 2010 Yorum yapılmamış

Uygulama geliştirirken bazen geçici olarak dosya oluşturmak zorunda kalabiliriz.

Fakat dosya oluşturma ve yazma iznimizin olduğu bir klasör olmasını her zaman garantileyemeyebiliriz.

Ayrıca, oluşturduğumuz dosya ile işimiz bittiğinde silinmesini de kendimizin yönetmesi gerekir.

Aşağıdaki kod ise, Windows‘un geçici dosyalar (temporary files) klasöründe rastgele isimde bir dosya oluşturur. Böylece geçici dosyanın temizlenmesi işini bizim yerimize Windows üstlenir.

public static string GeciciDosyaOlustur(string OnEk, string Uzanti)
{
	if (OnEk == null)
		throw new ArgumentNullException("OnEk");
	if (Uzanti == null)
		throw new ArgumentNullException("Uzanti");

	return Path.Combine(Path.GetTempPath(), String.Format("{0}.{1}.{2}", OnEk, Guid.NewGuid(), Uzanti));
}