c# jak sprawdzić ilość plikow w danym katalogu?

0

Witam.
za pomocą poniższej funkcji ustalam sobie katalog w ktorym chciałbym sprawdzić ilość plików o danym rozszerzeniu. jezeli we wskazanym katalogu są podkatalogi to zapisuje je sobie w ComboBoxie (dla innych celów).

if (DialogResult.OK == FolderSet.ShowDialog())
            {
                // Folder został wybrany
                DirCondition.Text = FolderSet.SelectedPath;
                DirConditionList.Items.Clear();
                string[] TabKat = Directory.GetDirectories(DirCondition.Text);
                foreach (string DirKat in TabKat)
                {
                    string[] Sciezka = DirKat.Split(new char[] { '\\' });
                    foreach (string SCR in Sciezka) Katalog = SCR;
                    DirConditionList.Items.Add(Katalog);
                }
             }

Po wybraniu katalogu chciałbym przeszukać jego zawartość (wraz z podkatalogami) czy znajdują sie tam pliki o danym rozszerzeniu. i danej wielkości (pliki które chce znaleźć , zawsze mają 1696 (0x6A0) bajtów)
Czy jest jakaś gotowa funkcja aby tego dokonać ?

0

Możesz skorzystać z metod Path.GetExtension, Directory.GetFiles oraz właściwości FileInfo.Length:

string[] filesPaths = Directory.GetFiles(dirPath);
int matchingFilesCount = 0;
foreach (string path in filesPaths)
{
    if (Path.GetExtension(path) == myExtension && new FileInfo(path).Length == 1696)
    {
        matchingFilesCount++;
    }
}

Warto się zastanowić także nad potencjalną osobną funkcją sprawdzającą warunki:

bool MatchesConditions(string filePath)
{
    return Path.GetExtension(filePath) == myExtension
        && new FileInfo(filePath).Length == 1696;
}
string[] filesPaths = Directory.GetFiles(dirPath);
int matchingFilesCount = 0;
foreach (string path in filesPaths)
{
    if (MatchesConditions(path))
    {
        matchingFilesCount++;
    }
}
2

GetFiles przyjmuje też pattern w konstruktorze, którego możesz użyć do wyszukiwania plików z konkretnym rozszerzeniem https://docs.microsoft.com/pl[...]etfiles?view=netframework-4.8 co powinno wpłynąć na szybkość rozwiązania. Możesz też od razu dostać listę wraz z podkatalogami

0

Ogólnie jest tak, ze już przy Waszej pomocy sobie poradziłem z przeszukaniem podkatalogów w celu znalezienia plików o spełniających kryteriach - dziękuje bardzo ;-)

Ale... napotkałem następny problem. Pliki, które wyszukuje są plikami o tej samej długości bajtów, plik ten zawiera kondycje technologiczne, zawierają takie dane, jak prędkość w mm/min, czas w sekundach itd. Oczywiste dla mnie było, aby te pliki sobie wczytać do tablicy byte, założyłem również, ze w tych plikach bajty odpowiadające za dane parametry będą w tych samych miejscach, wiec odczytując jakiś parametr, wystarczy, ze podam ofset, niestety gdy otrzymałem wszystkie pliki kondycji a jest ich prawie 400szt , to okazało się ze niestety pliki są tej samej długości, to dane w nich nie są zawsze na tych samych miejscach ;-(

W zawartości każdego pliku są dane podstawowe, jak np, informacja o tym do czego służy dana kondycja. przed odczytaniem wszystkich plików chciałem sobie załadować do jakiegoś combobox lub do jakiejś tabeli podstawowe informacje w celu późniejszego wyboru dokładnie jednej z nich i wczytać ją ze wszystkimi danymi do późniejszej edycji. Ponieważ dane są w rożnych miejscach to musiałbym odczytać cały plik, zdekodować z niego dane i podstawowe dane załadować do comboboxa, Zastanawiałem się czy może nie lepiej by było wczytać wszystkie 400 plików i zapamiętać je w jakiś tablicach.

Możecie mi doradzić jak podejść do tego tematu ?

0

[OT]aż się prosi o użycie bazy zamiast plików ale rozumiem, że pliki to zewnętrzne rozwiązanie[/OT]
wg mnie rozwiązanie z wczytaniem wszystkich plików na starcie i ich zdekodowanie do jakiejś logicznej struktury ma sens, szczególnie że tych danych nie będzie jakoś dużo (1000 plików po 2kB, doliczając nawet narzut struktur w które to opakujesz nie powinno zająć więcej jak 10-20MB w pamięci)

0

Oki, więc można by spróbować załadować pliki do tablic, musiałbym dynamicznie stworzyć tablice dla danych z plików i drugą tablice z listą tych plików. mógłby mi ktoś naświetlić jak to zrobić (kiedyś próbowałem zrobić jakieś tablice dynamicznie ale nie doszedłem do tego co robiłem źle, i zastosowałem inne rozwiązanie ) dziś nawet nie pamiętam jak ten temat ugryźć ;-(

0

Nie pisz tablicy, która synchronizuje się z inna tablicą, po indexsach, takie rzeczy można robić nisko poziomo lub w pythonie. W c# to strzał w kolano.
Nie dokonca znam Twój problem, jeśli w tych plikach są "te same" dane tylko zapisane trochę innaczej, to możesz napisać klase, lub kilka klas, z tym samym interfejsem. Każda klasa będzie posiadala ścieżke do pliku, odczytane dane jako właściwości, i metode do odczytu tych danych. Nie musi być to nic sprytnego ani wyrafinowanego, ani optymalnego. Chodzi o odciecie się od niskopoziomowego bałaganu, zebyś mógł, sobie ładnie te dane zorganizować.

0

napisać klasę, myślę.... ze to dobry pomysł, i wtedy odczytywać dane ze zmiennych w nowej klasie, niby fajny Pomysł, ale powiedz mi jak mam zdefiniować elementy danej klasy? ogólnie zakładam, ze otwierając nowy plik muszę zdefiniować nowy element stworzonej klasy, Muszę posiadać więc licznik elementów mojej klasy i odwoływać się później do każdego elementu osobno. Jak mam identyfikować później te elementy ?

0

Pomysł, ale powiedz mi jak mam zdefiniować elementy danej klasy?

Nie rozumiem, w jakim celu chcesz je później identyfikować. Nie rozumiem jaki problem chcesz rozwiązać. to za leży jakie masz dane i co chcesz znimi zrobić.

Jak mam identyfikować później te elementy
Muszę posiadać więc licznik elementów mojej klasy i odwoływać się później do każdego elementu
osobno. Jak mam identyfikować później te elementy ?

Najprościej trzymać każdą instancje klasy w liście, będzie tak jak w oryginalnym pomyśle, ale bez bólu głowy o synchronizacje 2 tablic. Klasa będzie miała pole z nazwą pliku wiec, możesz rozpoznawać je po tym.

List<int> lista = new  List<int>();
lista.Add(1);
lista.Add(22);
lista.Add(333);
Console.WriteLine(lista[1]); //22 
0

możesz pokazać strukturę tych plików? a właściwie struktury, bo mówisz że się różnią

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