Ceviz Forum

Geri Dön   Ceviz Forum > Programlama > Genel Programlama

Cevapla
 
LinkBack Seçenekler
Eski 23/08/2005, 22:24   #1 (permalink)
İptal Durumu
 
Euclides Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 04/2004
Yer: M86
Mesaj: 1,092
Varsayılan Alt Klasörler Problemim :(

Bir klasör ve onun alt klasörlerindeki dosyaların içinde geçen bir "şey"'i arayan bir kod yazıyorum. Recursive olmayan bir fonksiyon ile tüm dosyaları nasıl listeleyebilirim ? Recursive bir fonksiyon yazıp onu non-recursive hâle getirmeyi denedim ancak alloc'ladığım hafızayı kontrol etmek güç oldu (Kısaca başarılı denebilecek bir sonuç vermedi) Benim de ilk akılıma gelen çözüm tam directory tree çıkartmak oldu. Evet çalıştı ama hiç istemediğim bir tarzda kod yazmak zorunda kaldım.
Bir klasördeki alt klasörlerini tam adetini bilemediğim için önce FindFirstFile/ FindNextFile kaç adet alt klasör olduğunu buluyorum. Daha sonra ağacın dalları için gerekli memory'ı alıp, adlarını kaydetmek için 2. FindNextFile dögüsüne giriyorum.(bu bir dizayn hatası ama ben çözemedim)
İlk FindxxxFile döngüsünde adları bir buffer'a atmayı düşündüm fakat ne kadar gerekeceğini bilmediğim için bu sefer Buffer'im 2-3 parçalı bir hale gelebiliyor.
Sizce daha iyi bir kod için ne yapmalıyım ?
Vakit ayırdığınız için teşekkürederim.

Enson 24/08/2005 01:10 tarihinde Euclides tarafından düzenlenmiştir..
Euclides hatta değil   Alıntı Yaparak Yanıtla
Eski 23/08/2005, 22:58   #2 (permalink)
İptal Durumu
 
karamemed Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 07/2003
Mesaj: 195
Varsayılan

Hani derlerya özyineli bir algoritmayı düz bir algoritmaya çevireceksen %90 yığıt kulanmalısın diye, benim de aklıma ilk yığıtlı bir çözüm geldi. İşte düşüncem:

Eleman: Dosya veya dizin

PHP Kodu:
  klasör anaKlasör;
 
  while( 
true ){
    while( 
birEleman=klasör.sonrakiEleman() ){
       if(
birEleman.dosyamı()){
         
gerekliİşlemler(birEleman);//Dosyayı aç, arama yap sonuç olumlu ise yaz vs..
         
continue;
       }
       
//eleman dosya değil klasör. Bunu yığıta at
       
yığıt.elemanEkle(birEleman);
    }
    
//İlgili dizindeki tüm dosyalar bitti. Yığıttaki dizinlere geçelim
    
if( yığıt.elemanVarmı() )
       
klasör yığıt.elemanVer();
    else
       break;
  } 
Burada yığıt kullanarak son eklenen dizin ilk aranıyor. İlk eklenenin içine girilmesi için yığıt yerine kuyruk kullanılabilir. Ama genel mantık aynı. Bilmiyorum soruna iyi bir çözüm getiriyor mu?
karamemed hatta değil   Alıntı Yaparak Yanıtla
Eski 23/08/2005, 23:12   #3 (permalink)
Ali Çehreli
 
Üyelik Tarihi: 10/2002
Mesaj: 1,693
Varsayılan

Selam Euclides,

Bu sorunun yaniti Robert Sedgewick'in Algorithms in C kitabinda gecer. (Kitabin C++, vs. icin olanlari da var ama algoritmalarin o kitaplarda dille hemen hemen hic ilgileri yoktur.) Kitaba bakarak ve belki de gereksizce Turkcelestirerek yaziyorum.

Once ozyinelemeli olan agac ziyaret algoritmasi... Adam islemi bile algoritmanin icinde cikartip parametre olarak vermis

Kod:
// Varsayimlar:

// Soyle bir agac dugumu olsun
struct Dugum
{
     /* ... */
     struct Dugum * sol;
     struct Dugum * sag;
};

// Onun isaretcisine Baglanti diyelim
typedef Dugum * Baglanti;

// Dugumler uzerinde islem yapan ve kolaylik olsun diye
// birsey dOndUrmeyen islevleri soyle tanimlayalim
typdef void (*Islev)(Baglanti);

void ziyaret(Baglanti dugum, Islev islev)
{
    if (dugum == 0) return;

    islev(dugum);
    ziyaret(dugum->sol, islev);
    ziyaret(dugum->sag, islev);
}

Bu ozyinelemeli algoritmanin guzelligi, bizim ustu kapali olarak program yigitindan (program stack) yararlaniyor olusumuzdur. Onun yerine kendimiz yigit (stack) kullanirsak, ozyinelemeli yerine siradan bir islev yazabiliriz:

Kod:
void ziyaret(Baglanti dugum, Islev islev)
{
    Yigit yigit;

    yigita_ekle(yigit, dugum);

    while (!yigit.bos())
    {
        dugum = yigittan_cikart();
        islev(dugum);

        if (dugum->sag) yigita_ekle(yigit, dugum->sag);
        if (dugum->sol) yigita_ekle(yigit, dugum->sol);
}
Kitapta yazdigina gore, agaci degisik siralarda ziyaret etmek icin su seceneklerimiz var:

- once dugumu ziyaret edip sonra dallanmak icin (preorder); yigita once sag dali, sonra sol dali, ondan sonra dugumu ekleriz

- sirali olarak; yani once sol dali, sonra dugumu, daha sonra da sag dali ziyaret etmek icin (inorder); yigita once sag dali, sonra dugumu, ondan sonra sol dali ekleriz

- en son olarak dugumu ziyaret etmek icin (postorder); yigita once dugumu, sonra sag dali, sonra da sol dali ekleriz


Isin ilginci, yigit yerine kuyruk (queue) kullanirsak; bu sefer agaci dallanma yapmadan, yukaridan asagiya dogru ziyaret edebiliriz:

Kod:
void ziyaret(Baglanti dugum, Islev islev)
{
    Kuyruk kuyruk;

    kuyruga_ekle(kuyruk, dugum);

    while (!kuyruk_bos())
    {
        dugum = kuyruktan_cikart();
        islev(dugum);

        if (dugum->sag) kuyruga_ekle(kuyruk, dugum->sag);
        if (dugum->sol) kuyruga_ekle(kuyruk, dugum->sol);
}
Tabii bunlarin calismasi icin Yigit (veya Kuyruk) diye bir veri yapisina gerek duyulur.

C++'ta std::stack (veya std::queue) hemen ise yarar

Ali
acehreli hatta değil   Alıntı Yaparak Yanıtla
Eski 23/08/2005, 23:27   #4 (permalink)
İptal Durumu
 
Euclides Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 04/2004
Yer: M86
Mesaj: 1,092
Varsayılan

Sanırım herkes sadece bold olan kısıma kadar okumuş.
@karamemed:
Teşekkürederim. Ancak bu durumda da gene öngörülmeyen miktarda hafızaya ihtiyacımız oluyor. Ve realloc yapmak zorunda kalıyoruz.
Alıntı:
...ne kadar gerekeceğini bilmediğim için bu sefer Buffer'im 2-3 parçalı bir hale gelebiliyor...
Benim merak ettiğim realloc problemi olmadan bir çözüm üretebilirmiyiz (veya en az realloc ile)

@acehreli:
Benim problemim ile ilişkisini kuramadım
Euclides hatta değil   Alıntı Yaparak Yanıtla
Eski 23/08/2005, 23:36   #5 (permalink)
Ali Çehreli
 
Üyelik Tarihi: 10/2002
Mesaj: 1,693
Varsayılan

Ben bold olan kisma cevap yazmisim

Ali
acehreli hatta değil   Alıntı Yaparak Yanıtla
Eski 23/08/2005, 23:49   #6 (permalink)
İptal Durumu
 
karamemed Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 07/2003
Mesaj: 195
Varsayılan

Alıntı:
Euclides, mesajından alıntı:
Benim merak ettiğim realloc problemi olmadan bir çözüm üretebilirmiyiz (veya en az realloc ile)
İlginç bir durum. Aklıma saçma bir fikir geldi.

Yığıtımız sabit boylu olsun mesela 10 eleman kapasiteli. Yığıt doldukça bir temp dosyaya yazarız içeriğini. Yığıt boşalınca da geri doldururuz dosyadan. Yani dosyaya 10 eleman 10 eleman yazıp yığıt boşalınca son 10 elemenı okuyacağız dosyadan. Saçma ama bellek problemini çözüyor. Eski amelelerden kim kaldı
karamemed hatta değil   Alıntı Yaparak Yanıtla
Eski 24/08/2005, 00:29   #7 (permalink)
wanna sleep more
 
Volkan Uzun Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 11/2002
Yer: CA
Mesaj: 2,655
Varsayılan

bir vector dusun vector<folder_names>
1. bir function dusun parametre olarak folder_names i ve baslangic dizinini alsin
findfirstfile ve next ile iterate edip sadece dizinleri vectore push_back yapsin ama dosya isimlerini degil. bu functionin adi, getfolders olsun
ornek:
c:\deneme\abc.txt
c:\deneme\def.txt
c:\deneme\alt_dizin1\xyx.txt
c:\deneme\alt_dizin2\1234.
c:\deneme\alt_dizin2\alt_alt_dizin1\1234.txt
ve baslangic olarak c:\deneme verilirse;

bizim function vectore : c:\deneme\alt_dizin1, c:\deneme\alt_dizin2\ yazsin
2. baska bir function yaz, bu da folder_names parametre olarak alsin, ilk yaptigi is, bu vecktorun size_ini kontrol etmek olsun. first_len = 100; de
ve su donguye gir
int i = 1;
folder_names.push_back("c:\\deneme\\");

do
{
// eger folder_names[i] altinda alt dizin varsa vektorun sonuna eklenecek
// eger baska bisi kalmazsa eklenecek, vektorun lenghti i sabit kalacak
getfolders(folder_names,folder_names[i];
//i kontrolu yapmak lazim burada

}while(vecktorun yeni length ile bir onceki lenghti ayni olana dek)

arti tum subdizinler vecktordeo lduguna gore bastan baslayip sonra dek gidip dosyalari arastir ama iyi yontemmi dersen hayir

ben olsam shell commandi olan
dir *.*/s >>temp_file i cagiririm
sonrada bu dosyayi parse ederim :P
__________________
http://www.msnetprogrammer.net/blog (MCP & MCTS & MVM)
Volkan Uzun hatta değil   Alıntı Yaparak Yanıtla
Eski 24/08/2005, 01:07   #8 (permalink)
Eski Cevizci
 
mr1yh1 Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 04/2005
Yer: samsun
Mesaj: 1,171
Varsayılan

veri miktarı bilinmiyorsa
bağlı liste ya da realloc ( vector mantığı ) kullanılabilir.

acaba F.A.T den bu bilgi alınamaz mı ?
Alıntı:
Directory Table

A Directory Table is a special type of file that represents a directory (nowadays commonly known as a folder). Each file or directory stored within it is represented by a 32 byte entry in the table. Each entry records the name, extension, attributes (archive, directory, hidden, read-only, system and volume), the date and time of creation, the address of the first cluster of the file/directory's data and finally the size of the file/directory.
http://en.wikipedia.org/wiki/File_Al...irectory_Table
F.A.T. deki her kayıt sabit uzunlukda imiş.
directory table nin boyutunu elde edebilsek , altındaki dosya+klasör sayısı bulunur.

( resimden anladığım , F.A.T i doğrudan okumak mümkün)
http://forensics.cs.uri.edu/readings/FAT.htm
mr1yh1 hatta değil   Alıntı Yaparak Yanıtla
Eski 24/08/2005, 01:14   #9 (permalink)
İptal Durumu
 
Euclides Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 04/2004
Yer: M86
Mesaj: 1,092
Varsayılan

Alıntı:
mr1yh1, mesajından alıntı:
veri miktarı bilinmiyorsa
bağlı liste ya da realloc ( vector mantığı ) kullanılabilir.
teşekkürler mr1yh1
benim merak ettiğim zaten realloc kullanmadan Ağacımı oluşturabilirmiyim ?
(sanırım ilk mesajımda problemimi iyi anlatamadım)
2....
FindNext'i aynı iş için 2 kez çağırmaktan kurtulabilirmiyim ?
Alıntı:
mr1yh1, mesajından alıntı:
acaba F.A.T den bu bilgi alınamaz mı ?
Fakat NTFS'de kullanıyor olabilir.
Euclides hatta değil   Alıntı Yaparak Yanıtla
Eski 24/08/2005, 01:15   #10 (permalink)
İptal Durumu
 
Euclides Adlı Üyenin Profil Grafiği
 
Üyelik Tarihi: 04/2004
Yer: M86
Mesaj: 1,092
Varsayılan

Alıntı:
sanal_programci, mesajından alıntı:
ben olsam shell commandi olan
dir *.*/s >>temp_file i cagiririm
sonrada bu dosyayi parse ederim :P
en kısa çözüm
Euclides hatta değil   Alıntı Yaparak Yanıtla
Cevapla

Bookmarks

Seçenekler

Mesaj Yazma Hakları
Yeni mesajgöndermezsiniz
Cevap yazamazsınız
Dosya ekleyemezsiniz
Mesajınızı düzenleyemezsiniz

BB code is Açık
[IMG] kodu Açık
HTML kodu Kapalı
Trackbacks are Açık
Pingbacks are Açık
Refbacks are Açık

Benzer Konular
Konu Konuyu açana göre Forum Cevap En Son Mesaj
MySQL-PHP bağlantı problemim hmustak PHP 8 23/10/2006 03:53
silinmez klasörler sunny_smiley Windows 5 07/08/2005 20:17
fdisk de bölümleme problemim!!! fatihed Windows 3 07/08/2004 03:58
Klasörler Neden Bozuluyor? Cekici Windows 7 07/05/2004 10:08
Problemim devam ediyor. MTuncer Donanım 2 04/04/2004 08:42


Forum saati Türkiye saatine göredir. GMT +3. Şu anda saat 07:40.

Reklamlar & Desteklenenler
Hassas Valf | Hassas Kaplama | Antalyamız | Gazete | Ticari Bilişim | Hakan Müştak | Rüya Tabirleri | Kadın | Hastalıklar | Cepte msn ve e-posta | Webmaster | Antalya Aupair | Turkish Property Antalya | Forum | Chat | Perde | Adsl | Araba | bolindir.com | guncelle.com | livescore | Web Tasarım | evden eve nakliyat | forum | evden eve | sohbet | Resimcim| Kalifiye İnsan Kaynakları | Web Tasarım | Oyun | Yusuf KOÇ | Akın Yorulmaz | şiir | UFO | Web Tasarım | Oyunlar | Canlı Tv |


Forum Yazılımı: vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0
Copyright ©2001 - 2008, Ceviz.net