C - kopiranje fajlova

poruka: 5
|
čitano: 1.612
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
17 godina
neaktivan
offline
C - kopiranje fajlova

Pozdrav! Evo, imam jedan zadatak na kojem sam malo "zaštekao". Naime, trebam napisati četiri funkcije za rad s fajlovima (na UNIX-u). Ovo je kod koji imam zasad (nemam praktički ništa):

 


#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <time.h>
#include <utime.h>
#include <malloc.h>

#include <string.h>
#include <stdio.h>

#include "datoteke.h"

/*!
 * Dohvaca sadrzaj direktorija = popis datoteka
 * \param direktorij    Ime direktorija (relativno u odnosu na program)
 * \param broj       Adresa gdje ce se pohraniti broj datoteka
 * \returns polje s imenima datoteka, tj. kazaljka na "char *imena[*broj]"
 * Mjesto za imena se zauzima s 'malloc', nakon sto se izracunalo koliko
 * prostora treba za sve [ broj*sizeof(char *) + zbroj velicina za sva imena ]
 */
char **dohvati_datoteke ( const char *direktorij, int *broj )
{
    /* za napraviti */
    struct dirent *de = NULL;
    DIR *d = NULL;
    struct stat statbuf;
    struct tm *timeinfo;
    char **imena;

    d = opendir ( &direktorij ); /* 'otvara' direktorij */

    if ( d == NULL )
    {
       perror ( "opendir" );
       return 2;   
    }

    while ((de = readdir (d) != NULL) {

       if (de->d_name[0] == '.')
                  continue;
      



    return NULL;
}

/*!
 * Usporedjuje dvije datoteke (samo atribute velicine i vremena zadnje promjene)
 * \param ime1    Ime prve datoteke
 * \param ime2    Ime druge datoteke
 * \returns 0, ako su datoke jednake, 1 inace
 */
int usporedi ( const char *ime1, const char *ime2 )
{
    /* za napraviti */
    fprintf ( stderr, "Nije implementirano!\n" );

    return 0;
}

/*!
 * Kopira prvu datoteku u drugu, pritom ocuva i vremena zadnje promjene
 * \param ime1    Ime prve datoteke
 * \param ime2    Ime druge datoteke
 * \returns 0, ako je kopiranje uspjesno, 1 inace
 */
int kopiraj_datoteku ( const char *ime1, const char *ime2 )
{
    /* za napraviti */
    fprintf ( stderr, "Nije implementirano!\n" );

    return 0;
}

/*!
 * Dohvaca i vraca vrijeme zadnje promjene datoteke u formatu:
 * YYYY-MM-DD_HH-MM-SS, npr. 2010-07-21_17-08-05
 * \param ime       Ime datoteke
 * \param vrijeme    Adresa za smjestaj vremena
 * \returns 0, ako je dohvat uspjesan, 1 inace
 */
int vrijeme_zadnje_promjene ( const char *ime, char *vrijeme )
{
    /* za napraviti */
    fprintf ( stderr, "Nije implementirano!\n" );

    return 0;
}

 

E, sad, meni bi trebale neke smjernice što da točno napravim jer nemam baš nekih ideja. Započeo sam funkciju dohvati datoteke i sad sam zapeo kod dijela gdje pohranjujem imena datoteka. Ideja mi je da while petljom prolazim kroz direktorij i pritom u neku matricu pohranjujem imena fajlova koji su u tom direktoriju. E sad, napravio sam dupli pointer tipa char na imena. To bi trebala biti ta matrica. Alociranje memorije je dinamičko. Kak da to točno izvedem? I jel uopće ideja dobra?

http://3.141592653589793238462643383279502884197169399375105820974944592.com/index314.html
Poruka je uređivana zadnji put ned 26.9.2010 21:24 (1domagoj1).
 
0 0 hvala 0
17 godina
neaktivan
offline
C - kopiranje fajlova

Evo prve funkcije, ne znam jel je to u redu:

 

char **dohvati_datoteke ( const char *direktorij, int *broj )
{
   struct dirent *de = NULL;
   DIR *d;
   char **imena = NULL;
   *broj = 0;
   int brojac_datoteka = 0;

   d = opendir ( direktorij ); /* 'otvara' direktorij */

   if ( d == NULL )
   {
       perror ( "opendir" );
       return 1;  
   }

   while ((de = readdir(d)) != NULL) {
     
       if (de->d_name[0] == '.')
                  continue;
       brojac_datoteka++;
   }

   imena = (char **)malloc(brojac_datoteka*sizeof(char *));

   rewinddir(d);

   while ((de = readdir(d)) != NULL) {
      
       if (de->d_name[0] == '.')
                  continue;
     
       imena[*broj] = (char*) malloc ((strlen(de->d_name))*(sizeof(char) + 1));
       strcpy (imena[*broj], de->d_name);
       (*broj)++;

   }
  
   closedir(d);

   return imena;
}

 

Gdje sam pogriješio i jel se može bolje to napraviti?

 

EDIT: Evo, ispravio sam funkciju. To bi trebalo biti to.

EDIT2: Evo, ovo je konačna ispravka funkcije i dobra je. Ako neko zna bolji način, samo recite.

http://3.141592653589793238462643383279502884197169399375105820974944592.com/index314.html
Poruka je uređivana zadnji put pon 27.9.2010 2:36 (1domagoj1).
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C - kopiranje fajlova

ja bi radije išao na vezane liste nego na 2 put čitanje sadržaja direktorija...

*broj?? Šta fali dobrom starom int i?

 

if (de->d_name[0] == '.') će ti preskočiti sve skrivene fajlove na unixu, a ne samo . i ..

17 godina
neaktivan
offline
C - kopiranje fajlova

Zato što sam ja već dobio zadanu funkciju/e s argumentima koju/e trebam dovršiti i eto, takva/e je/su kakva/e je/su. Da, znam da onaj uvjet preskaće sve skrivene fajlove (i ./ i ../), to nije previše niti bitno. S listama ne baratam najbolje, pa se nisam usudio ništa s njima raditi (ko zna kolko bi mi vremena uzelo), ako ti se da, možeš napisati odsječak, pa da vidim. Inače, gotov sam sa svime, sa sve četiri funkcije i rade sve onak kak trebaju. :)

http://3.141592653589793238462643383279502884197169399375105820974944592.com/index314.html
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C - kopiranje fajlova
očito sam previdio to da su funkcije deklarirane... a i čini mi se da ovaj readdir(d) funkcionira na principu vezanih lista, tako da je došlo na isto ko da si vezane liste koristio..
samo onaj *broj promini u "obični" broj...
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice