nauka c# - przeszukiwanie folderów

0

Witam

Otóż chciałbym napisać program który zwracał by ścieżkę do folderu po wpisaniu np konkretnego id które jest przed nazwą folderu np mamy folder wyszukiwanie i w tym folderze rozne jeszcze np o nazwie "010 uzytkownicy" i w tym folderze 010 sa jeszcze katalogi np 010-15 i w nim kolejny np 010-15-02 itd.

Generalnie po wpiasaniu tego pełnego id np 063-200-15-01 chciałbym żeby mi pokazał ścieżkę do tego katalogu a jak np nie ma katalogu o ostatnim id 01 to żeby pokazał ścieżkę do katalogu 063-200-15 itd.

Nie wiem czy dobrze tłumaczę generalnie początek kodu który rozpoczyna całą operacje mam więc podsyłam

        private void button1_Click(object sender, EventArgs e)
        {
            string sciezka = @"C:\Users\Patryk\Desktop\wyszukiwanie_dsds";
            try
            {
                textBox1.Text = "";
                foreach (string s in Directory.GetDirectories(sciezka))
                {
                    textBox1.Text += s + Environment.NewLine;
                }
            }

            catch (Exception ex)
            {
                textBox1.Text = "";
                textBox1.Text = ex.Message;
            }
        }
0

w ogole nie rozumiem co chcesz zrobic. Wez to czytaj az zrozumiesz, ze Twoje wyjasnienie nie ma sensu.
Wtedy wez gleboki oddech i napisz w punktach co ma sie dziac (krotko i tresciwie z przykladem)

Dodatokwe pytania

  1. Jaka jest sciezka do szukania? Caly komputer? Dany folder?
  2. Gdzie ma zwracac ta sciezke?
0

Chciałbym napisać program w obiektowym c# mam czystego textboxa w którym mają zostać zwracane ścieżki posiadam folder o nazwie wyszukiwanie_dsds i w tym folderze są różne podkatalogi powiedzmy 100 i nazwy tych katalogów to "001 nazwa" itd aż do "100 nazwa" w każdym katalogu znajduje się podfolder o kolejnym numerze id tym razem przykładowo w folderze o id 001 podfoldery zaczynajace sie "001-01 nazwa" itd mam buttona który pokazuje mi ścieżki do podfolderów znajdujących się w folderze który chcę przeszukać czyli w "wyszukiwanie_dsds" posiadam kolejnego texboxa w którym wpisał bym np pełne id i pokazało by mi ścieżkę do tego id w textboxie1 czyli np jak wpisze 001-10-02-15 to ma mi pokazać ścieżkę do tego folderu znajdującego się głęboko w wyższych folderach w katalogu "wyszukiwanie_dsds" pierwszy button mi działa ale nie wiem jak właśnie wejść głębiej podsyłam ss

title

0

https://www.google.nl/search?q=deep+search+directory+c%23&rlz=1C1GCEA_enNL771NL771&oq=deep+search+directory+c%23&aqs=chrome..69i57.2797j0j7&sourceid=chrome&ie=UTF-8

https://msdn.microsoft.com/en-us/library/dd383304(v=vs.110).aspx

masz pelne sciezki, wiec jezeli szukasz danej sciezki to mozesz sprawdzic czy dana nazwa (wprowadzona), znajduje sie w sciezce. Jezeli tak, to mozesz wybrac ta sciezke.

0

a mógłbyś podesłać mi kod bo z angielskim u mnie jeszcze najlepiej nie jest wciąż się uczę natomiast jeśli chodzi o informacje zawarte na stronach które mi podesłałeś są dla mnie póki co jeszcze nie do końca jasne :D

0

Trochę pokombinowałem i prawie dobrze tylko że prawie robi wielką różnice :D nie do końca tą ścieżkę miało mi wypluć :D

title

0

temat do zamknięcia znalazłem rozwiązanie i kod działa ^^

Edit:
Pojawił się kolejny problem doszedłem do działania programu jednak działa zbyt wolno po wpisaniu konkretnego id się zawiesza nawet do kilku minut i nie odpowiada po jakimś tam czasie oczywiście wypluje mi wynikami i otworzy mój wymarzony podfolder w katalogach ;) nie wiem jak by go ugryźć aby go usprawnić w jakiś sposób.
Z góry dziękuję za pomoc i podsyłam gotowy kod programu.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string sciezka = @"sciezka katalogu głównego"
        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = "";
                foreach (string s in Directory.GetDirectories(sciezka, textBox3.Text + "*", SearchOption.AllDirectories))
                {
                    textBox1.Text += s + Environment.NewLine; ;
                    String tekst = "";
                    tekst = s;
                    System.Diagnostics.Process.Start("explorer.exe", tekst);
                }
            }
            catch (Exception ex)
            {
                textBox1.Text = "";
                textBox1.Text = ex.Message;
            }
        }
0

Wiem już że ta linijka ```foreach (string s in Directory.GetDirectories(sciezka, textBox3.Text + "*", SearchOption.AllDirectories))



@Edit:
Z tego co wyczytałem dobrym sposobem była by tu złożność obliczeniowa ale nie wiem jak się za nią zabrać :p
0

Ale czemu Ty w foreach uruchamiasz Process.Start?
No i po co w ogóle robisz jakieś wyszukiwanie, skoro znasz nazwę katalogu (bo podaje ją użytkownik)? Wystarczy sprawdzić czy katalog istnieje.

0

No nie do końca znam nazwy katalogów ponieważ użytkownik wpisuje powiedzmy przykładowy indeks "0093-015-05" a nazwa tego katalogu jest umieszczona np C:\Users\Patryk\Desktop\wyszukiwanie_dsds\0093 "dalsza nazwa katalogu"\0093-015-05 0472.8310 poza tym przekopywanie się 5 tys katalogow w celu znalezienia tego jednego po tym jak już program sprawdzi czy istnieje nie jest za fajne ;)

somekind napisał(a):

Ale czemu Ty w foreach uruchamiasz Process.Start?

jak nie mam wforeach ```
process.start

0

Udało mi się stworzyć mniej więcej taki kodzik:

        private void Search(string nrindeksu)
        {
            string sciezka = @"sciezka katalogu glownego w ktorym bede szukal";
            string indeks = ""; //"0023-012-01-02"
            if (indeks.Length == 0) indeks = nrindeksu;
            textBox1.Text += indeks.Split('-')[0];
            foreach (string katalog in Directory.GetDirectories(sciezka, "*" + indeks.Split('-')[0] + "*", SearchOption.TopDirectoryOnly))
            {
                textBox1.Text += Environment.NewLine + katalog;
                sciezka = katalog;
                skanujKatalog(sciezka, indeks, 2);
                break;
            }
        }

        private void skanujKatalog(string sciezka, string indeks, int licznik)
        {
            string[] wynik = indeks.Split('-');
            string nrid = "";
            string nowaSciezka = "";
            if (wynik.GetUpperBound(0) == (licznik - 1))
            {
                //otworz(sciezka);
                return;
            }
            try
            {
                for (int i = 0; i <= licznik; i++)
                {
                    if (i == licznik) nrid += wynik[i];
                    else nrid += wynik[i] + "-";
                }
            }
            catch (Exception ex)
            {
                //otworz(sciezka);
                return;
            }
            foreach (string katalog in Directory.GetDirectories(sciezka, nrid + "*", SearchOption.TopDirectoryOnly))
            {
                textBox1.Text += katalog + Environment.NewLine;
                nowaSciezka = katalog;
                break;
            }
            if (nowaSciezka.Length == 0)
            {

                return;
            }
            if (nowaSciezka != sciezka)
            {
                skanujKatalog(nowaSciezka, indeks, ++licznik);
            }
        }

I teraz Pytanie jak stworzyć odwołanie do tych funkcji tak aby po kliknięciu na button cały proces zapisany w funkcjach skanujKatalog i Search się odpalał i uruchamiał ten szukany folder? ^^ jak próbowałem stworzyć odwołanie na podstawie tej funkcji którą stworzyłem to visiual studio wyplowalo mi taki blad:
Błąd CS7036.

0
patrykkxdd napisał(a):

No nie do końca znam nazwy katalogów ponieważ użytkownik wpisuje powiedzmy przykładowy indeks "0093-015-05" a nazwa tego katalogu jest umieszczona np C:\Users\Patryk\Desktop\wyszukiwanie_dsds\0093 "dalsza nazwa katalogu"\0093-015-05 0472.8310 poza tym przekopywanie się 5 tys katalogow w celu znalezienia tego jednego po tym jak już program sprawdzi czy istnieje nie jest za fajne ;)

yyy, jakie przekopywanie?

string root = @"C:\Users\Patryk\Desktop\wyszukiwanie_dsds\";
string index = "0093-015-05";
string parts = index.Split('-');

string topLevelDir = Path.Combine(root, parts[0]); // zwróci "C:\Users\Patryk\Desktop\wyszukiwanie_dsds\0093", o którym wiesz, że ma istnieć, nie trzeba go szukać.
string patternToSearch = $"{index}*";
string[] targets = Directory.GetDirectories(topLevelDir, patternToSearch); // poszukujesz tylko wewnątrz "C:\Users\Patryk\Desktop\wyszukiwanie_dsds\0093" katalogów, które zaczynają się na "0093-015-05", nie musisz przeszukiwać podkatalogów

// no i w tym momencie chyba wiadomo już co otworzyć

O ile dobrze zrozumiałem problem, bo struktura, o której piszesz w tym poście jest inna od struktury opisanej w pierwszym poście, a obie są różne od tej z posta ze screenem.
Najlepiej jakbyś wrzucił screen z eksplorera z rozwiniętym drzewem tych katalogów, żeby było w końcu wiadomo jak one się w sobie zagnieżdżają i jak ich nazwy są od siebie zależne.

0

title

Muszę przeszukać wszystkie katalogi bo tak to ma mniej więcej działać jak na zdjęciu ^^

Fakt mają zupełnie inną strukturę ale to dlatego że starałem się rozbić indeks który jak sam zaóważyłeś jest oddzielany myślnikami i są pozakopywane w różnych katalogach ;)
Po wpisaniu całego indeksu ma mi znaleźć i otworzyć ten katalog :D mam nadzieje że już teraz jest dobrze wytłumaczone o co mi chodzi bo sam nie jestem pewny tego czy w odpowiedni sposób przekazuję informacje :D

0

No dobra, ale to nadal musisz zrobić 3 wyszukiwania na jednym poziomie zamiast przeszukiwania całego drzewa katalogów.

string root = @"C:\Users\Patryk\Desktop\wyszukiwanie_dsds\";
string index = "0093-015-05";
string parts = index.Split('-');
 
var topLevel = Directory.GetDirectories(root, $"{parts[0]}*").Single(); // poszukujesz tylko wewnątrz "C:\Users\Patryk\Desktop\wyszukiwanie_dsds\" katalogów, które zaczynają się na "0093"
var middleLevel = Directory.GetDirectories(topLevel, $"{index}*").Single(); // wewnątrz znalezionego katalogu znajdujesz ten zaczynający się na "0093-015-05"

No i teraz pozostaje w middleLevel znaleźć znowu ten interesujący docelowy katalog. Znowu nie wiem jak, bo raz podajesz dane wejściowe w formacie 063-200-15-01, a raz 0093-015-05, więc nie wiem jak w końcu ma być. :P

0

No i teraz pozostaje w middleLevel znaleźć znowu ten interesujący docelowy katalog. Znowu nie wiem jak, bo raz podajesz dane wejściowe w formacie 063-200-15-01, a raz 0093-015-05, więc nie wiem jak w końcu ma być. :P

podaje te dane przykładowo. Powiedzmy że użytkownik posiada te indeksy. Folderów jest masa po uruchomieniu właściwości folderu jest ich dokładnie po wyliczeniu przez system 62 435 folderów.

0

Problem polega na tym, że Ty nie opisałeś wymagań, cały czas operujesz terminem "indeks", którego nie zdefiniowałeś, a my nie wiemy co to jest.
Generalnie łatwiej by było jakbyś napisał jakiego efektu oczekujesz dla jakich danych wejściowych i stanu początkowego.
Np. dla takich pięciu przypadków:

0011
0012-015
0257-010-01-01-01
0230-005-01
0023-012-01-61

co się ma wydarzyć w aplikacji jeśli:

  • katalog istnieje
  • katalog nie istnieje

No i pytanie, czy może być więcej grup niż 5? No i z tego, co zamieściłeś na pierwszym screenie wynika, że prefiksy katalogów układają się następująco:

0011
|--0011-005-01
   |--0011-005-01-05

i nie ma tu miejsca na piąty indeks jak w przypadku 0257-010-01-01-01 z Twojego pliku.

0

Już tłumaczę ew jak wrócę do domu to podrzucę filmik z działającego kodu który nie sprawdza się przy większej ilości folderów :D
Weźmy przykładowo taki "indeks"
0212-050-01-11
jest aplikacja która ma 2x textboxy i jeden button w jednym textboxie jest możliwość wpisania indeksu .Po naciśnięciu buttona wywalić do niego ścieżkę w drugim textboxie i otwirzyc szukany folder. Po wpisaniu ww indeksu i naciśnięciu buttona wyobrażam sobie mniej więcej takie działanie: Program ma sprawdzić, wyszukać i wejść w ten katalog jeśli istnieje 0212 następnie szuka dalej po numerze w już tym katalogu "0212" i szuka dalej "0212-050" jeśli istnieje znowu jak wcześniej wchodzi do podkatalogu o tej nazwie i szuka dalej "0212-050-01" itd aż dojdzie do ostatniego numeru z indeksu i na końcu otwiera folder docelowy czyli "0212-050-01-11"
Oczywiście może się zdarzyć sytuacja że docelowy folder znajduje się w innym podkatalogu tak jak w tym przypadku po ścieżce widać C:\Users\Patryk\Desktop\wyszukiwanie_dsds\0212 Sarl BEHR\0212-050-01\W opracowaniu\0212-050-01-11 że jest folder pomiędzy o nazwie "w opracowaniu" bez żadnego indeksu :D program również ma to wziąć pod uwagę.
Jeśli natomiast na jakimś etapie nie znajdzie folderu to zostawia otwarty ten z ostatnim indeksem czyli np "0212-050"
Mniej więcej o coś takiego chodzi ale jak wrócę do domu to jeszcze podeślę filmik z tym kodem który zamula aplikacje przy większej ilości :D

0

No i pytanie, czy może być więcej grup niż 5? No i z tego, co zamieściłeś na pierwszym screenie wynika, że prefiksy katalogów układają się następująco:

0011
|--0011-005-01
   |--0011-005-01-05

i nie ma tu miejsca na piąty indeks jak w przypadku 0257-010-01-01-01 z Twojego pliku.

Może program ma właśnie sprawdzić :D po kolei lecieć :D

0

Czyli nie ma ustalonych reguł i tych poziomów zagłębienia może być potencjalnie nieograniczona liczba?

0
somekind napisał(a):

Czyli nie ma ustalonych reguł i tych poziomów zagłębienia może być potencjalnie nieograniczona liczba?

Dokładnie

0

No to też jest coś, co powinieneś od razu napisać.

0
somekind napisał(a):

No to też jest coś, co powinieneś od razu napisać.

Fakt jednak nie do końca wiedziałem jak przekazać informacje i sam się gubiłem w tym co piszę na forum :D ale dzięki tobie i twoim pytaniom które kierowałeś myślę że sytuacja nieco się rozjaśniła :D

Edit:
Tak jak obiecałem przesyłam link do pobrania nakręconego filmiku z działania programu przy kodzie który jest w stanie zawiesić aplikacje jak jest zbyt duża ilość katalogów.
http://chomikuj.pl/patrykkxdd
Tak ma wyglądać i działać :D

0

jest w stanie ktoś mi pomóc na tym forum?

0

Wrzuć repo na gita i filmik na YT.

Myślisz, że ludzie nie mają co robić jak ściągać jakieś pliki .rar z chomika?

0
Smutny Programista napisał(a):

Wrzuć repo na gita i filmik na YT.

Myślisz, że ludzie nie mają co robić jak ściągać jakieś pliki .rar z chomika?

za około 7 min podrzucę link do filmiku na yt.

Link do filmiku na YT.

0

Dobra prawie działa ale znowu mam problem bo nie wiem jak muszę zmienić ścieżkę żeby program przestał się zapętlać bo na chwilę obecną tylko umiem podać ścieżkę z ręki. Kod wygląda tak:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using System.Configuration;

namespace WindowsFormsApp3
{
    public partial class Szukaj : Form
    {
        public Szukaj()
        {
            InitializeComponent();
            //textBox2.Text = "0187-200-079";
                
        }
        private void Search(string nrindeksu)
        {
            string sciezka = @"Ścieżka do katalogu głównego";
            string indeks = ""; //"0023-012-01-02"
            if (indeks.Length == 0) indeks = nrindeksu;
           // textBox1.Text += indeks.Split('-')[0];
            foreach (string katalog in Directory.GetDirectories(sciezka, "*" + indeks.Split('-')[0] + "*", SearchOption.TopDirectoryOnly))
            {
              //  textBox1.Text += Environment.NewLine + katalog;

                sciezka = katalog;
                skanujKatalog(sciezka, indeks, 2);
                System.Diagnostics.Process.Start("explorer.exe", sciezka);
                break;
            }
        }

        private void skanujKatalog(string sciezka, string indeks, int licznik)
        {
            string[] wynik = indeks.Split('-');
            string nrid = "";
            string nrindeksu = indeks;
            string nowaSciezka = "";
            Search(nrindeksu);
            if (wynik.GetUpperBound(0) == (licznik - 1))
            {
                return;
            }
            try
            {
                for (int i = 0; i <= licznik; i++)
                {
                    if (i == licznik) nrid += wynik[i];
                    else nrid += wynik[i] + "-";
                }
            }
            catch (Exception)
            {
                System.Diagnostics.Process.Start("explorer.exe", sciezka);
                return;
            }
            foreach (string katalog in Directory.GetDirectories(sciezka, nrid + "*", SearchOption.TopDirectoryOnly))
            {
                textBox1.Text += katalog + Environment.NewLine;
                nowaSciezka = katalog;
                break;
            }
            if (nowaSciezka.Length == 0)
            {
                System.Diagnostics.Process.Start("explorer.exe", sciezka);
                return;
            }
            if (nowaSciezka != sciezka)
            {
                skanujKatalog(nowaSciezka, indeks, ++licznik);
            }
            else
            {
                System.Diagnostics.Process.Start("explorer.exe", sciezka);
            }
        }
        private void otworz_Click(object sender, EventArgs e)
        {
            string sciezka = "";
            string indeks = textBox2.Text;
            //string nrindeksu = "";
            int licznik = 0;
            skanujKatalog(sciezka, indeks, licznik);
            //Search(nrindeksu);
        }
    }
}

Ilość komentarzy to po prostu metoda prób i błędów aby osiągnąć sukces więc na komentarze nie zwracajcie uwagi :D ^^

0
private void Search(string nrindeksu, string sciezka)
        {
        if(sciezka!="")
        {
            sciezka = @"Ścieżka do katalogu głównego";
        }

Doszedłem do takiego rozwiązania i nie wiem co dalej :/ pomóżcie ładnie proszę ;)

0

Czy często program będzie przeszukiwać katalogi? Czy często się zmieniają? Jeżeli na pierwsze pytanie odpowiedź jest twierdząca, a na drugie nie, to warto przemyśleć prawdziwe zaindeksowanie tych katalogów i utworzenie z nich struktury danych. Ja bym to widział tak:

Każdy element indeksu opowiada jednemu węzłowi, z tym że każdy węzeł drzewa oprócz informacji o przodku, zawiera informację o ścieżce. Ale ścieżka jest wypełniona pod warunkiem, że danemu elementowi węzła odpowiada istniejący katalog. Czyli dla katalogów

- 011 Root
|-- 011-12-15 First
|-- 011-13 Second

Mielibyśmy taką strukturę:

        ID: 011
        Path: "011 Root"
      /                       \
     /                         \
  ID: 12                   ID: 13
  Path: null             Path: "011 Root\\011-13 Second"
  |
  ID: 15
  Path: "011 Root\\011-12-15 First"

Mając taki indeks jesteś w stanie znaleźć katalog szybko i wydajnie.

0
Sarrus napisał(a):

Czy często program będzie przeszukiwać katalogi? Czy często się zmieniają? Jeżeli na pierwsze pytanie odpowiedź jest twierdząca, a na drugie nie, to warto przemyśleć prawdziwe zaindeksowanie tych katalogów i utworzenie z nich struktury danych. Ja bym to widział tak:

Każdy element indeksu opowiada jednemu węzłowi, z tym że każdy węzeł drzewa oprócz informacji o przodku, zawiera informację o ścieżce. Ale ścieżka jest wypełniona pod warunkiem, że danemu elementowi węzła odpowiada istniejący katalog. Czyli dla katalogów

- 011 Root
|-- 011-12-15 First
|-- 011-13 Second

Mielibyśmy taką strukturę:

        ID: 011
        Path: "011 Root"
      /                       \
     /                         \
  ID: 12                   ID: 13
  Path: null             Path: "011 Root\\011-13 Second"
  |
  ID: 15
  Path: "011 Root\\011-12-15 First"

Mając taki indeks jesteś w stanie znaleźć katalog szybko i wydajnie.

Jeśli chodzi o pytanie pierwsze to zależy od użytkownika natomiast jeśli chodzi o drugie pytanie zgaduje że często.

0

pomoże ktoś ze skonstruowaniem tego ifa do ścieżki tak żeby program się nie zapętlał? Nie chcę już w żaden sposób przekształcać kodu a jedynie potrzebuje doradztwa jak zrobić żeby program się nie zapętlał przy jednej ścieżce

1 użytkowników online, w tym zalogowanych: 0, gości: 1