Merhaba arkadaşlar
yeni bir program yazıyorum ve bir kaç işlemden sonra elimde bir yol oluyor örneğin D:\resimler gibi
ben bu yolu alıp bunun içinde bulunan bütün alt klasörlerin yollarını bir arrayliste atmam gerekiyor arrayde olabilir farketmez yeterki bulayım artık yolunu kaç gündür kafa patlatıyorum birçok algoritma denedim hala çözümü bulamadım
yardım edeceklere şimdiden teşekkürler..
---------- Post added at 08:26 ---------- Previous post was at 08:03 ----------
Bende sonra arayacak arkadaşlar için söylüyorum
tamamdır arkadaşlar buldum olayı
Directory.GetDirectories(Path,"*",SearchOption.AllDirectories)
bu kod yani arama ayarlarını böyle yaptıgımızda o klasör ve onun bütün alt klasörleri geliyor :)
Cevaplar
A
kodu tamamen incelemedim ancak şu işini güzelce görecek gibi. takıldığın noktasında tekrar sorarsan bakarız. ( java'cıyım :P )
using System;
[FONT=monospace]
using System.Collections.Generic;
[/FONT][FONT=monospace]
using System.IO;
[/FONT][FONT=monospace]
class Program
[/FONT][FONT=monospace]
{
[/FONT][FONT=monospace] static void Main()
[/FONT][FONT=monospace] {
[/FONT][FONT=monospace] // Get all files in Documents
[/FONT][FONT=monospace] List<string> dirs = FileHelper.GetFilesRecursive(@"C:\Users\Sam\Documents");
[/FONT][FONT=monospace] foreach (string p in dirs)
[/FONT][FONT=monospace] {
[/FONT][FONT=monospace] Console.WriteLine(p);
[/FONT][FONT=monospace] }
[/FONT][FONT=monospace] // Write count
[/FONT][FONT=monospace] Console.WriteLine("Count: {0}", dirs.Count);
[/FONT][FONT=monospace]
Console.Read();
[/FONT][FONT=monospace] }
[/FONT][FONT=monospace]}
[/FONT][FONT=monospace]
static class FileHelper
[/FONT][FONT=monospace]
{
[/FONT][FONT=monospace] public static List<string> GetFilesRecursive(string b)
[/FONT][FONT=monospace]
{
[/FONT][FONT=monospace] // 1.
[/FONT][FONT=monospace] // Store results in the file results list.
[/FONT][FONT=monospace]
List<string> result = new List<string>();
[/FONT][FONT=monospace]
// 2.
[/FONT][FONT=monospace]
// Store a stack of our directories.
[/FONT][FONT=monospace]
Stack<string> stack = new Stack<string>();
[/FONT][FONT=monospace]
// 3.
[/FONT][FONT=monospace]
// Add initial directory.
[/FONT][FONT=monospace]
stack.Push(b);
[/FONT][FONT=monospace]
// 4.
[/FONT][FONT=monospace] // Continue while there are directories to process
[/FONT][FONT=monospace]
while (stack.Count > 0)
[/FONT][FONT=monospace] {
[/FONT][FONT=monospace] // A.
[/FONT][FONT=monospace] // Get top directory
[/FONT][FONT=monospace]
string dir = stack.Pop();
[/FONT][FONT=monospace]
try
[/FONT][FONT=monospace]
{
[/FONT][FONT=monospace] // B
[/FONT][FONT=monospace] // Add all files at this directory to the result List.
[/FONT][FONT=monospace]
result.AddRange(Directory.GetFiles(dir, "*.*"));
[/FONT][FONT=monospace]
// C
[/FONT][FONT=monospace]
// Add all directories at this directory.
[/FONT][FONT=monospace]
foreach (string dn in Directory.GetDirectories(dir))
[/FONT][FONT=monospace] {
[/FONT][FONT=monospace] stack.Push(dn);
[/FONT][FONT=monospace] }
[/FONT][FONT=monospace] }
[/FONT][FONT=monospace]
catch
[/FONT][FONT=monospace]
{
[/FONT][FONT=monospace] // D
[/FONT][FONT=monospace] // Could not open the directory
[/FONT][FONT=monospace] }
[/FONT][FONT=monospace] }
[/FONT][FONT=monospace]
return result;
}
[/FONT]}
edit : kodu biraz düzenlemem lazım. tekrar koyacağım.
aynen bende buna benzer bişey arıyorum çok teşekkürler yardımın için ancak konuyu actıktan 5 dk sonra çözümü buldum :)
Bende sonra arayacak arkadaşlar için söylüyorum
Directory.GetDirectories(Path,"*",SearchOption.All Directories)
bu kod yani arama ayarlarını böyle yaptıgımızda o klasör ve onun bütün alt klasörleri geliyor
yanlız direk sürücü yolu verilirse hata verecektir örnek C:\ gibi unauthorized accees exception diye diskteki erişilmesi yasak klasörleri de saymaya çalışacağı için örnek System Volume Information gibi. onun çözümünüde siz bulursunuz artık ben buldum :)
R
kodu tamamen incelemedim ancak şu işini güzelce görecek gibi. takıldığın noktasında tekrar sorarsan bakarız. ( java'cıyım :P )
[FONT=monospace]....[/FONT]
Aman abi ne yaptın, recursive çağırsan dizin taramalarında daha rahat edersin(muhtemelen de biliyorsun). Bırak callstack'e bassın kod kendini, daha az satır ve daha rahat bu tür işler için ;)
G
Aşağıda daha önce otomatik yedekleme için yazdığım recursive var. İnceleyebilirsiniz.
void Basla(string Klasor)
{
string[] Klasorler = Directory.GetDirectories(Klasor);
foreach (string KlDizi in Klasorler)
{
DirectoryInfo KlasorBilgisi = new DirectoryInfo(KlDizi);
//listBox1.Items.Add(KlasorBilgisi.FullName);
//listBox1.Items.Add(KaynakDosya + KlasorBilgisi.FullName.Substring(22));
// Klasörleri kopyalıyoruz.. Aslında aynısını oluşturuyoruz.
Directory.CreateDirectory(KaynakDosya + KlasorBilgisi.FullName.Substring(22));
// Klasördeki dosyaları listeliyoruz...
string[] Dosyalar = Directory.GetFiles(KlasorBilgisi.FullName);
// Döngüye sokuyoruz hepsini tek tek kopyalamak için.
foreach (string Dosya in Dosyalar)
{
FileInfo DosyaBilgisi = new FileInfo(Dosya);
//listBox1.Items.Add(DosyaBilgisi.Name);
File.Copy(DosyaBilgisi.FullName, KaynakDosya + "\\" + KlasorBilgisi.FullName.Substring(22) + "\\" + DosyaBilgisi.Name);
}
Basla(KlasorBilgisi.FullName);
}
}
A
Aman abi ne yaptın, recursive çağırsan dizin taramalarında daha rahat edersin(muhtemelen de biliyorsun). Bırak callstack'e bassın kod kendini, daha az satır ve daha rahat bu tür işler için ;)
ben çok hızlı bir tarama ile bu kodu internetten edindim. çok da fantastik bir şey değil zaten.
Aslında kişilere güzel bir stack kullanım örneği içeriyor. recursive; az satır, kolay okuma, data arttıkça exponansiyel yavaşlama, yüksek seviyeli dillerde insecure code gibi faydalı ve zararlı özellikleri olan bir kod yazma yöntemidir. tavsiyem düşük seviyede recursive olsa da yükseldikce daha straight forward ve looplara güvenmek yönünde olacak. tabi bu bir tercih meselesi. sonuçta kaç tane pc'de milyonlarca directory olabilir ki ?
R
Valla ben C/C++'çı gibi bakıyorum ister istemez dünyaya. :) Burada exponansiyel yavaşlama olmayacaktır çünkü exponansiyel görünse de aynı sayıda dizin taranacak ve algoritma karmaşıklığı yine aynı olacaktır.(Algoritma karmaşıklığı döngüsel ve recursive çağrılarda kesinlikle şudur demek mümkün değildir.) Ha şuna katılıyorum, işletim yığıtı aç kapa işlemleri, ve kullanılan bellek alanı az da olsa biraz daha fazla olabilir (olmayabilir de çünkü loop için kullanılan stack kodu nispetten daha yavaş kodlar içeriyor olabilir).
Recursive fonksiyonları nükleer teknoloji gibidir, doğru kullanılırsa(ikili ağaçlar) çok daha sağlam ve güvenilirdir ama yanlış kullanılırsa ( en basitinden fibonacci) işlemciyi gereksiz yere zorlatır. Dizin taramada ise yine ağaç yapısı olduğu için ben recursive fonksiyon kullanırım.
kodu try-catch bloğu içerisne al. hata yaptığında catch kısmına düşsün.
A
ben çok hızlı bir tarama ile bu kodu internetten edindim. çok da fantastik bir şey değil zaten. Aslında kişilere güzel bir stack kullanım örneği içeriyor. recursive; az satır, kolay okuma, data arttıkça exponansiyel yavaşlama, yüksek seviyeli dillerde insecure code gibi faydalı ve zararlı özellikleri olan bir kod yazma yöntemidir. tavsiyem düşük seviyede recursive olsa da yükseldikce daha straight forward ve looplara güvenmek yönünde olacak. tabi bu bir tercih meselesi. sonuçta kaç tane pc'de milyonlarca directory olabilir ki ?
hedef sorunu çözmekse izlenilen yollar sadece süreçtir :)
ne demiş adamlar; insanlar yolda karşılaştığınız fırtınalara değil gemiyi karaya çıkarıp çıkarmadığınıza bakar :)
S
bende bu kodla düzelttim işine yarayacaktır
using System;using System.Collections.Generic;using System.IO;class Program{ static void Main() { // Get all files in Documents List<string> dirs = FileHelper.GetFilesRecursive(@"C:\Users\Sam\Documents"); foreach (string p in dirs) { Console.WriteLine(p); } // Write count Console.WriteLine("Count: {0}", dirs.Count); Console.Read(); }}static class FileHelper{ public static List<string> GetFilesRecursive(string b) { // 1. // Store results in the file results list. List<string> result = new List<string>(); // 2. // Store a stack of our directories. Stack<string> stack = new Stack<string>(); // 3. // Add initial directory. stack.Push(b); // 4. // Continue while there are directories to process while (stack.Count > 0) { // A. // Get top directory string dir = stack.Pop(); try { // B // Add all files at this directory to the result List. result.AddRange(Directory.GetFiles(dir, "*.*")); // C // Add all directories at this directory. foreach (string dn in Directory.GetDirectories(dir)) { stack.Push(dn); } } catch { // D // Could not open the directory } } return result; } }
ooo döktürmüşsünüz yine :) sorunumu hallettim ama yineden yorumlarınız iyi geldi.
bu arada yaptığım programı bitirdim isteyenler bakabilir
http://code.google.com/p/paradox-resim-temizleyici/
belki işinize yaramaz ama olsun :) bu forumdan bir kişinin işine yarıcağı kesinde :)
K
Emeğine sağlık.
Cevabını yaz
Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.