![]() | |
| | #1 (permalink) |
| İptal Durumu Üyelik Tarihi: 04/2004 Yer: M86
Mesaj: 1,092
|
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.. |
| | |
| | #2 (permalink) |
| İptal Durumu Üyelik Tarihi: 07/2003
Mesaj: 195
|
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: |
| | |
| | #3 (permalink) |
| Ali Çehreli Üyelik Tarihi: 10/2002
Mesaj: 1,693
|
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);
}
- 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);
}
C++'ta std::stack (veya std::queue) hemen ise yarar ![]() Ali |
| | |
| | #4 (permalink) | |
| İptal Durumu Üyelik Tarihi: 04/2004 Yer: M86
Mesaj: 1,092
|
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ı:
@acehreli: Benim problemim ile ilişkisini kuramadım | |
| | |
| | #6 (permalink) | |
| İptal Durumu Üyelik Tarihi: 07/2003
Mesaj: 195
| Alıntı:
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ı | |
| | |
| | #7 (permalink) |
| wanna sleep more Üyelik Tarihi: 11/2002 Yer: CA
Mesaj: 2,655
|
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) |
| | |
| | #8 (permalink) | |
| Eski Cevizci Üyelik Tarihi: 04/2005 Yer: samsun
Mesaj: 1,171
|
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ı:
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 | |
| | |
| | #9 (permalink) | ||
| İptal Durumu Üyelik Tarihi: 04/2004 Yer: M86
Mesaj: 1,092
| Alıntı:
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ı:
| ||
| | |
![]() |
| Bookmarks |
| Seçenekler | |
| |
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 |
| 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 | |