FindFirst() & FindNext() pod Unixem

FindFirst() & FindNext() pod Unixem
EL
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad 14 lat
  • Postów:1
0

Witajcie,

może ktoś z Was implementował odpowiedniki tych windowsowych funkcji pod Unixa i mógłby mi wskazać drogę jak to zrobić. Myślę, że najprościej było by wywołać komendę ls -m1, która pokaże mi pliki odpowiadające wzorcowi, następnie umieścić ich nazwy w jakimś wektorze i kolejno zwracać...ale pewnie da się to zrobić lepiej :/

Kopiuj
int FindFirst(char *wzorzec, char * wynik){

FILE * fp;
char path[100];

char* cmd;
sprintf(cmd,"%s%s","ls -m1 ",wzorzec);
fp = popen(cmd, "r");

if (fp == NULL) { printf ("%s \n", "BLAD"); return -1;} 
   
while (fgets(path, 100, fp) != NULL)  //da się czytać z pliku

//...

int status = pclose(fp);

if (status == -1) {
   
} 

else {

}

}

}

Proszę o podpowiedzi

nav
  • Rejestracja:prawie 22 lata
  • Ostatnio:około miesiąc
  • Lokalizacja:Warszawa
0

utf-8 rlz! ٩(ಥ_ಥ)۶
Azarien
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 3 godziny
0

Patrzę w źródła Free Pascala, który pod Linuksem ma emulowane wersje FindFirst/FindNext, i widzę że FindNext w pętli odpala syscall getdents64 aż znajdzie kolejny plik pasujący do wzorca.

Azarien
  • Rejestracja:prawie 22 lata
  • Ostatnio:około 3 godziny
0

Twój pomysł z wektorem i zwracaniem kolejnych elementów powinien działać. Wektor i indeks trzymaj w strukturze, którą stworzysz w FindFirst a przekazywać będziesz do FindNext.
Nie będzie to to samo co windowsowe funkcje, które szukają za każdym FindNext następnego pliku, a nie od razu wszystkich przy FindFirst, ale da ten sam efekt.

Wibowit
  • Rejestracja:ponad 20 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:XML Hills
0

Może da się użyć nazwanych potoków. Jeśli ustawi się mały rozmiar potoku (tzn bufora czy jak to tam nazwać), np 500 bajtów (co przekłada się na średnio kilkadziesiąt nazw plików), to ls wypełni bufor, a potem będzie czekał, aż te dane zaczniesz wyciągać.

Pytanie co zrobić, gdy programista nie wywoła FindClose, a ls dalej będzie czekał, aż pobierzemy dane. Można ustawić timeout, po którym ubijamy ls + trzymać zbiór nazw plików, które już były zwracane przez FindFirst/ FindNext i oraz odpalać ls od nowa, jeżeli odstęp od ostatniego FindNext był większy od timeoutu. Zbiór zwróconych nazw przyda się przy pomijaniu nazw po ponownym odpaleniu ls.

Czemu też nie skorzystasz z linku podanego przez nav?


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
Wibowit
  • Rejestracja:ponad 20 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:XML Hills
0

To napisz jak rozwiązałeś.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
KU
  • Rejestracja:prawie 15 lat
  • Ostatnio:prawie 6 lat
  • Postów:166
0

Takie głupie pytanie... Co złego jest w glob(), że nie chcesz go użyć?

man 3p glob

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.