katalogi w C (unix)

0

Witam, mam duzy problem z obsluga unixowych katalogow w C. Bede bardzo wdzieczny jesli ktos zechce poswiecic mi pare minut.
Mam funkcje ktora dostaje dwa katalogi jako argumenty: dir1 i dir2. Jezeli dir1 zawiera plik ktorego nie zawiera dir2 to kopiuje plik z dir1 do dir2.

Napisalem funkcje do kopiowania plikow. copy(char *plik1, char *plik2) - kopiuje plik1 do plik2.
Mam funkcje
compare_dirs(char *sciezka_do_dir1, char *sciezka_do_dir2) ktora ma porownywac katalogi ktore dostaje jako argumenty.
Jak na razie, biore d_name z pierwszego katalogu i przelatuje po wszystkich z drugiego. Jezeli nie znajde takiego samego pliku w drugim to wywoluje
copy(plik1_kat1, plik1_kat2) zeby skopiowac plik.

W wersji optymistycznej, bo w praktyce program nie przechodzi po wszystkich plikach tylko staje na pliku "."
Nie wiem tez jak podac funkcji copy() ktora dostaje dwie nazwy plikow jako argumenty sciezke do katalogu ktory otworzylem...

Z plikami "." oraz ".." probowalem sobie poradzic dodajac dodatkowe warunki na taka nazwe pliku i opuszczajac przejscie petli "continue" ale nic to nie dalo.

void compare_dirs(char *path_dir1, char *path_dir2)
{
    DIR *pDIR1 ;
    DIR *pDIR2 ;
    struct dirent *pDirent1 ;
    struct dirent *pDirent2 ;

    pDIR1 = opendir(path_dir1);
    pDIR2 = opendir(path_dir2);

    pDirent1 = readdir(pDIR1);
    pDirent2 = readdir(pDIR2);

while (pDirent1 != NULL)
{
  while (pDirent2 != NULL)
  {
   if (strcmp(pDirent1->d_name, pDirent2->d_name)!=0)
   copy(dir1/plik_w_dir1,   dir2/sciezka_plik_w_dir2) ;  /// ???

   pDirent2=readdir(pDIR2);
   }
pDirent1 = readdir(pDIR1);
}

}

Pozdrawiam

0
void compare_dirs(char *path_dir1, char *path_dir2)
{
    DIR *pDIR1 ;
    DIR *pDIR2 ;
    struct dirent *pDirent1 ;
    struct dirent *pDirent2 ;

    pDIR1 = opendir(path_dir1);
    pDIR2 = opendir(path_dir2);

    pDirent1 = readdir(pDIR1);
    pDirent2 = readdir(pDIR2);
    short int found;

    while (pDirent1 != NULL)
    {
        found = 0;
        while (pDirent2 != NULL)
        {
            if (strcmp(pDirent1->d_name, pDirent2->d_name)==0)
                found = 1;
            pDirent2=readdir(pDIR2);
        }
    if(!found)
        copy(dir1/plik_w_dir1,   dir2/sciezka_plik_w_dir2) ;  /// ???
    pDirent1 = readdir(pDIR1);
    }
}

Nie wiem czy zadziała, nie mam możliwości sprawdzić (mam nadzieję, że nie walnąłem znowu jakiejś gafy ;p)
Trzeba jeszcze dodać pomijanie '.' i '..' oraz sprawdzanie czy mamy do czynienia z plikiem.

0

Nie wiem czy zadziała, nie mam możliwości sprawdzić (mam nadzieję, że nie walnąłem znowu jakiejś gafy ;p)
Trzeba jeszcze dodać pomijanie '.' i '..' oraz sprawdzanie czy mamy do czynienia z plikiem.</quote>

Nie ma szans zadzialac bo tak naprawde to ten sam program, moze sie niejasno wyrazam. CHodzi o to, ze nie wiem jak przekazac funkcji copy sciezke do katalogu ktory wlasnie otworzylem, copy przyjmuje tylko stringi jako argumenty.

0
void compare_dirs(char *path_dir1, char *path_dir2)
{
    DIR *pDIR1 ;
    DIR *pDIR2 ;
    struct dirent *pDirent1 ;
    struct dirent *pDirent2 ;
    char *tmp1;
    char *tmp2;

    pDIR1 = opendir(path_dir1);
    pDIR2 = opendir(path_dir2);

    pDirent1 = readdir(pDIR1);
    pDirent2 = readdir(pDIR2);
    short int found;

    while (pDirent1 != NULL)
    {
        found = 0;
        while (pDirent2 != NULL)
        {
            if (strcmp(pDirent1->d_name, pDirent2->d_name)==0)
                found = 1;
            pDirent2=readdir(pDIR2);
        }
    if(!found) {
        tmp1 = malloc(strlen(path_dir1) + strlen(pDirent1->d_name) + 1);
        tmp2 = malloc(strlen(path_dir2) + strlen(pDirent1->d_name) + 1);
        strcat(tmp1, path_dir1);
        strcat(tmp1, pDirent1->d_name);
        strcat(tmp2, path_dir2);
        strcat(tmp2, pDirent1->d_name);
        copy(tmp1, tmp2) ;
        free(tmp1); free(tmp2);
    }
    pDirent1 = readdir(pDIR1);
    }
}

EDIT: Trzeba jeszcze sprawdzić czy na końcu nazwy katalogu jest '/' :)

0

szczerze dziękuje :) dodałem jeszcze warunek na "." i ".." i / za nazwa katalogu i program zdaje się działać, ale tylko dla jednego pliku w katalogu. A to dlatego, że free() nie zwalania tego wskaznika i za nastepną petlą dopisuje kolejne ścieżki, zapamietane za poprzednim przejsciem.
np. po pierwszy przejsciu wysyla do copy(dir1/plik1, dir2/plik1) a za drugim copy(dir1/plik1dir1/plik2, dir2/plik2). Nie rozumiem dlaczego free nie dziala w tym przypadku

0

Sprobuj zmienić malloc na calloc lub pierwsze strcat na strcpy (raczej wykorzystaj to drugie - zastosowanie strcat na pustym obszarze to chyba błąd).

0

poradzilem sobie, pierwsza strcat() zmienilem na strcpy()

musze jeszcze dodac kilka funkcji i pewnie pojawia sie problemy wiec jakbys znalazl chwile to zerkaj czasami w ten topic ;) a jak na razie dzieki raz jeszcze

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