Filestream | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar filestream

Bu kodda ne yanlış var? – 9

20 August 2011 12 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?

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

01 March 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);
		}
	}
}