3 tane wav dosyayı 1 dosya içine yığmak ve burdan okutmak!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

http://delphi.about.com/od/adptips2005/ ... emerge.htm

bu linkte bir dosyanin birden fazla dosyaya bolunmesi ve sonra tekrar birlestirmesi mevcut. bunu tersine cevirirseniz istediginizi elde edersiniz.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

BlockRead ve BlockWrite komutlarını açıklamam istenmiş.
Emriniz başım üstüne :wink:

Kod yazmayıp yol göstermek istiyorum. Adım adım yapmanız gerekenleri yazayım;

1- Biri dosyalarınızın toplam boyutunda (adına toplam diyelim), diğeri en büyük dosyanızın boyutunda (bunun adı da gecici olsun) olmak üzere 2 adet byte dizisi oluşturun.

2- Toplam dizisine en büyük boyutlu dosyanızın baytlarını yazın (BlockRead ile)

3- gecici dizisine 2. dosyanızı doldurun (yine blockread ile).

4- Bir döngü ile, gecici dizisindeki baytları, ilk dosyanın bittiği yerden itibaren toplam dizisine yazın

5-gecici dizisine 3. dosyanızı doldurun

6- Bir döngü ile, gecici dizisinin baytlarını, toplam dizisinin kalan kısmına yazın

7- Toplam dizisini BlockWrite komutu ile bir dosyaya kaydedin.

Buna benzer bir şekilde, dosyayı tekrar 3'e bölebilirsiniz.
Kod yazmadığım için kusura bakmayın, ama acemilere en iyi yardım bu şekilde yapılıyor :wink:
Cevap yazmakta geciktiğim için de özür diliyorum, sadece cuma cumartesi pazar akşamları internete girebiliyorum.
Son olarak, lütfen bana hocam demeyin. Çünkü tahmin edebileceğiniz en küçük yaştayım :oops:
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

procedure SplitFile(FileName:tFileName;DosyaBilgileri:TStringList);
var
   fs, ss: TFileStream;
   cnt : integer;
   SplitName: String;
begin
   fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
   try
     for cnt:=0 to DosyaBilgileri.Count - 1  do
     begin
       SplitName := ChangeFileExt(FileName, Format('%s%d', ['._',cnt])) ;
       ss := TFileStream.Create(SplitName, fmCreate or fmShareExclusive) ;
       try
         ss.CopyFrom(fs, strtoint(DosyaBilgileri[cnt]));
       finally
         ss.Free;
       end;
     end;
   finally
     fs.Free;
   end;
end;

bu procedur wawların tumunun icinde bulundugu dosyanin yolunu ve vaw dosyalarinin boyut bilgilerini iceren stringlist tipindeki bir degisken alir. sonuc olarakta dosyadaki butun wav lari birlesmis._0, birlesmis._1 seklinde disari atar.


Kod: Tümünü seç

function CombineFiles(Files:Array Of TFileName;CombinedFileName : TFileName;DosyaBilgileri:TStringList) : Boolean;
var
  cnt:integer;
  i: integer;
  fs, sStream: TFileStream;
  filenameOrg: String;
//  OncekiKonum:int64;
begin
  i := 1;
//  OncekiKonum :=0;
  fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive);
 try
 for cnt:=low(Files) to high(Files) do
 begin
  if FileExists(Files[cnt]) then
    begin
      sStream := TFileStream.Create(Files[cnt], fmOpenRead or fmShareDenyWrite);
      DosyaBilgileri.Add(inttostr(sStream.Size));
//      OncekiKonum := OncekiKonum + sStream.Size;
      try
        fs.CopyFrom(sStream, 0);
      finally
        sStream.Free;
      end;
      Inc(i);
//      fs.Position :=OncekiKonum;
      Files[cnt] := ChangeFileExt(Files[cnt], '.'+ FormatFloat('000', i));
    end;
 end;
  finally
    fs.Free;
  end;
end;
bu prosedurde birlestirilecek dosyalari, birlestirme sonucunda olusacak dosyayi ve her dosyanin boyutunun saklanacagi bir degisken alir.


Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
var
Dosyalar:array [0..1] of TFileName;
begin
DosyaBilgileri.Clear;
Dosyalar[0] := 'a.txt';
Dosyalar[1] := 'b.txt';
CombineFiles(Dosyalar,'birlesmis.txt',DosyaBilgileri);
DosyaBilgileri.SaveToFile('info.txt');
end;
a.txt ve b.txt birlestirilip birlesmis.txt ye yaziliyor. dosyalarin boyut bilgileri de info.txt de saklaniyor.


Kod: Tümünü seç

procedure TForm1.Button2Click(Sender: TObject);
begin
DosyaBilgileri.LoadFromFile('info.txt');
SplitFile('birlesmis.txt',DosyaBilgileri);
end;
buda birlesmis dosyalari geriye acar.

dosyabilgilerini de birlesmis.txt dosyasinda ya da direkt exenin içerisinde tutmak mumkun tabi...
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

Merhaba,
ulu coder yazdı:BlockRead ve BlockWrite komutlarını açıklamam istenmiş.
Emriniz başım üstüne :wink:


BlockRead ve BlockWrite ile ilgili sıkıntımı lütfen emir olarak değerlendirmeyin!
ulu coder yazdı:Son olarak, lütfen bana hocam demeyin. Çünkü tahmin edebileceğiniz en küçük yaştayım :oops:
- Bilgi seviyesi benden yüksek olup bana yol gösteren herkes, fiziksel yaşı ne olursa olsun, benim için bir öğretmen ve hocadır.

@ulu coder tekrar bilgilerini paylaştığın için teşekkür ederim :)

@sadettinpolat,

- Açılamalı yazdığınız bu kodlar işimi kolaylaştıracak.

Allah da sizin işlerinizi kolaylaştırsın!

Tekrar yardımcı olan herkese çok teşekkür ederim :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
Kullanıcı avatarı
bluekid
Kıdemli Üye
Mesajlar: 541
Kayıt: 11 Haz 2004 10:45
İletişim:

Mesaj gönderen bluekid »

midijor
Hocam veritabanı kullanmak, milisaniye bazından gecikmeye(Latency) sebep olduğundan
kaç tane wav dosyası kullanacaksınız eğer bu sayı fazlaysa tek dosyaya birleştirimiş wav'ları çıkarmak da gecikmeye sebep olur.
Kullanıcı avatarı
sertkayasalih
Üye
Mesajlar: 178
Kayıt: 12 Haz 2003 12:47
Konum: Antalya
İletişim:

Mesaj gönderen sertkayasalih »

bk yazdı: kaç tane wav dosyası kullanacaksınız eğer bu sayı fazlaysa tek dosyaya birleştirimiş wav'ları çıkarmak da gecikmeye sebep olur.
- Hocam haklısınız. Toplam 1400 adet wav dosyası var.

- Veritabanında söylediğiniz gibi yapılması mümkün. Programın, OnCreate olayında hepsini Temp klasörüne gönderip(export) ordan kullanıp, işlem bitince de hepsini silmek. Böylece gecikme de ortadan kalkar.

Hocam, kaygılarımı biraz daha açayım.
- Bir yıla yakın emek verdiğim bu wav dosyalarımı paketleme üzerinde durmamın sebebi şu; başkalarının bu wav dosyalarına ulaşmalarını engelleyebilmek.
Veritabanı yöntemi kullanırsak, OnCreate olayında Temp klasörüne export edilen wav dosyaları yine açıkta kalacak!
Temp klasörünü veya wav dosyalarını gizlemenin(Hidden) dışında daha güvenli bir yol nasıl bulabilirim?

Tekrar yardımlarınız için çok teşekkür ederim :)
Bilgi; iki tarafı keskin kılıca benzer.
İyi kullanılmazsa, ya karşıyı, ya da sahibini
keser.
ulu coder
Üye
Mesajlar: 838
Kayıt: 01 Nis 2006 06:46
Konum: Ankara

Mesaj gönderen ulu coder »

Kötü bir niyetim yoktu. Amacım, bu forumdaki birinin programlama hakkındaki isteğinin benim açımdan emir olduğunu göstermekti.

Bu başlık altında bunları yazmak pek doğru değil biliyorum ama yanlış olma olmasın istedim...
Cevapla