FindFirst() & FindNext() pod Unixem

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 :/

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

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.

0

Wyświetlanie listy plików odpowiadających wzorcowi już mam..pytanie co dalej i jak napisać FindNext()

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.

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?

0

Skorzystałbym ale pojawia mi się nowy problem - chciałbym aby funkcja rozpoznawała wzorce typu l*.TXT i wyszukiwała wszystkie pliki na litere l itp. przypadki -np. kończące się na określoną literę. Nie bardzo wiem jak sobie z tym poradzić, a użycie komendy unixowej eliminuje mi radzenie sobie z wyszukiwaniem wg. wzorca...

if((dirh=opendir("."))==NULL){
    return -1;
  }
  for(dirp =readdir(dirh);dirp!=NULL;dirp =readdir(dirh)){
      if(**strcmp((const char*)wzorzec,"*.TXT")==0**){  
0

Problem rozwiązany :)

0

To napisz jak rozwiązałeś.

0

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

man 3p glob

0

http://www.linuxquestions.org/questions/programming-9/findfirst-findnext-in-linux-18844/#post81349 trochę kodu stąd i link nava załatwiło sprawę, jest prosto i działa. Dziękuję

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