Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа для синхронизации каталогов в Linux на с 
:(
    Опции темы
sveta_2000
Дата 11.3.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.3.2008

Репутация: нет
Всего: нет



Привет всем! Меня зовут Света, учусь на информационных технологиях, вот делаю курсак на си, короче проблема в том что есть уже готовая программа но я не как не могу правильно е запустить, тоесть я её запуская ./a.out /home/di1 /home/dir2 а она говорит что неправильный адрес, я ВАС всех очень прошу помочь, вот код самой программы:
Код


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
#include<dirent.h>
#include<time.h>
#include<sys/stat.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/wait.h>

int i;
char cwd1[NAME_MAX], cwd2[NAME_MAX];

struct fileinfo
{
char filename[NAME_MAX];
char tprint[NAME_MAX];
long size;
time_t filetime;
}inf;

struct fileinfo allf1st[NAME_MAX];
struct fileinfo allf2nd[NAME_MAX];

int mystat1st(char dname[NAME_MAX], struct fileinfo *allf1st);
int mystat2nd(char dname[NAME_MAX], struct fileinfo *allf2nd);
int dirhandler(char *key1,char *key2,char *dir1,char *dir2);

void copyfiles(char *file1st,char *file2nd);
void aboutprg(void);


int main(int argc, char **argv)
{
if(argc==2)
{
if(strcmp(argv[1],"-h")==0)
aboutprg();
return 0;
}
else
{
dirhandler(argv[1],argv[2],argv[3],argv[4]);
}
return 0;
}


int dirhandler(char *key1,char *key2, char *dir1,char *dir2)
{
struct fileinfo inf;
int a1,a2,d1,d2,j1,j2;
char stdf1[NAME_MAX],stdf2[NAME_MAX],stdp1[NAME_MAX],stdp2[NAME_MAX];
if(strcmp(key2,"-x")==0)
{
aboutprg();
return 0;
}
else
{
d1=mystat1st(dir1, allf1st);
for(a1=0;a1<d1;a1++)
{
printf("\n 1st--> %s/%s:%d:%s",cwd1,allf1st[a1].filename,allf1st[a1].size,allf1st[a1].tprint);
}
d2=mystat2nd(dir2,allf2nd);
for(a2=0;a2<d2;a2++)
{
printf("\n 2nd-->%s/%s:%d^%s",cwd2,allf2nd[a2].filename,allf2nd[a2].size,allf2nd[a2].tprint);
}
for(j1=0;j1<d1;j1++)
{
for(j2=0;j2<d2;j2++)
{
if(strcmp(allf1st[j1].filename,allf2nd[j2].filename)==0)
printf("identical names:\n %s/%s\n %s/%s",cwd1,allf1st[j1].filename,cwd2,allf2nd[j2].filename);
if(allf1st[j1].size=allf2nd[j2].size)
{
printf("\nIsentical size: \n %s/%s:%d\n %s/%s:%d",cwd1,allf1st[j1].filename,allf1st[j1].size,cwd2,allf2nd[j2].filename,allf2nd[j2].size);
}
if(allf1st[j1].filetime==allf2nd[j2].filetime)
{
printf("\nIdentical times: \n %s/%s:%s\n %s/%s:%s",cwd1,allf1st[j1].filename,allf1st[j1].tprint,cwd2,allf2nd[j2].filename,allf2nd[j2].tprint);
}
}
}
if(strcmp(key1,"-s")!=0)
{
for(j1=0;j1<d1;j1++)
{
for(j2=0;j2<d2;j2++)
{
if(strcmp(allf1st[j1].filename,allf2nd[j2].filename)!=0)
{
sprintf(stdf1,"%s/%s",cwd1,allf1st[j1].filename);
copyfiles(stdf2,cwd1);
sprintf(stdf2,"%s/%s",cwd2,allf2nd[j2].filename);
copyfiles(stdf1,cwd2);
}
}
}
}
for(j1=0;j1<d1;j1++)
{
for(j2=0;j2<d2;j2++)
{
if(strcmp(allf1st[j1].filename,allf2nd[j2].filename)==0)
{
if(allf1st[j1].filetime<allf2nd[j2].filetime)
{
sprintf(stdf1,"%s/%s",cwd2,allf2nd[j2].filename);
copyfiles(stdf1,cwd1);
}
if(allf1st[j1].filetime>allf2nd[j2].filetime)
{
sprintf(stdf1,"%s/%s",cwd1,allf1st[j1].filename);
copyfiles(stdf1,cwd2);
}
}
}
}
}
return 0;
}


void copyfiles(char *file1st,char *file2nd)
{
pid_t cpid,wpid;
int status;
cpid=fork();
if(!cpid)
execlp("cp","cp",file1st,file2nd,NULL);
wpid=waitpid(cpid,&status,0);
}



int mystat1st(char dname[NAME_MAX],struct fileinfo *allf1st)
{
DIR *dir;
struct dirent *ent;
struct stat st;
struct fileinfo inf;
char ttp[NAME_MAX];

if(chdir(dname)==-1)
perror("Unable to change directory");
if((dir=opendir("."))==NULL)
{
perror("\nUnable to open directory");
exit(1);
}
getcwd(cwd1,NAME_MAX);
i=0;
while ((ent=readdir(dir))!=NULL)
{
if((strcmp(ent->d_name,".")==0)||(strcmp(ent->d_name,"..")==0))
continue;
{
if(stat(ent->d_name,&st)==0)
{
if(S_ISREG(st.st_mode))
{
strcpy(allf1st[i].filename,ent->d_name);
allf1st[i].size=st.st_size;
allf1st[i].filetime=st.st_atime;
sprintf(ttp,"%s",ctime(&st.st_atime));
strcpy(allf1st[i].tprint,ttp);
i++;
}
}
}
}
return i;
}

int mystat2nd(char dname[NAME_MAX],struct fileinfo *allf2nd)
{
DIR *dir;
struct dirent *ent;
struct stat st;
struct fileinfo inf;
char ttp[NAME_MAX];
if(chdir(dname)==-1)
perror("Unable to change directiry");
if((dir=opendir("."))==NULL)
{
perror("\nUnable to open directory");
exit(1);
}
getcwd(cwd2,NAME_MAX);
i=0;
while((ent=readdir(dir))!=NULL)
{
if((strcmp(ent->d_name,".")==0)||(strcmp(ent->d_name,"..")==0))
continue;
{
if(stat(ent->d_name,&st)==0)
{
if(S_ISREG(st.st_mode))
{
strcpy(allf2nd[i].filename,ent->d_name);
allf2nd[i].size=st.st_size;
allf2nd[i].filetime=st.st_atime;
sprintf(ttp,"%s",ctime(&st.st_atime));
strcpy(allf2nd[i].tprint,ttp);
i++;
}
}
}
}
return i;
}

void aboutprg(void)

{
printf("\n\t\t SVETA");
}

PM MAIL   Вверх
andrew_121
Дата 11.3.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Ну хоть код отформатируй...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
sveta_2000
Дата 11.3.2008, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 11.3.2008

Репутация: нет
Всего: нет



Чесно говоря я даж незнаю что Вы имели ввиду, немогли б Вы просто запустить её у ся и посмотреть?
PM MAIL   Вверх
JackYF
Дата 11.3.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(sveta_2000 @  11.3.2008,  18:26 Найти цитируемый пост)
Чесно говоря я даж незнаю что Вы имели ввиду

Отступы в коде. Код люди читают, не только компилятор.




--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
andrew_121
Дата 11.3.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Светуля, глянь-ка, так наверное приятней и проще читать ?:
Код

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <unistd.h>
#include<dirent.h>
#include<time.h>
#include<sys/stat.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/wait.h>

int    i;
char    cwd1[NAME_MAX], cwd2[NAME_MAX];

struct fileinfo {
    char        filename[NAME_MAX];
    char        tprint[NAME_MAX];
    long        size;
    time_t    filetime;
}inf;

struct fileinfo    allf1st[NAME_MAX];
struct fileinfo    allf2nd[NAME_MAX];

int mystat1st( char dname[NAME_MAX], struct fileinfo* allf1st );
int mystat2nd( char dname[NAME_MAX], struct fileinfo* allf2nd );
int dirhandler( char* key1, char* key2, char* dir1, char* dir2 );

void copyfiles( char* file1st, char* file2nd );
void aboutprg( void );


int main( int argc, char** argv ) {
    if ( argc == 2 ) {
        if ( strcmp( argv[1], "-h" ) == 0 ) {
            aboutprg();
        }
        return 0;
    } else {
        dirhandler( argv[1], argv[2], argv[3], argv[4] );
    }
    return 0;
}


int dirhandler( char* key1, char* key2, char* dir1, char* dir2 ) {
    struct fileinfo    inf;
    int                    a1, a2, d1, d2, j1, j2;
    char                    stdf1[NAME_MAX], stdf2[NAME_MAX], stdp1[NAME_MAX], stdp2[NAME_MAX];
    if ( strcmp( key2, "-x" ) == 0 ) {
        aboutprg();
        return 0;
    } else {
        d1 = mystat1st( dir1, allf1st );
        for ( a1 = 0; a1 < d1; a1++ ) {
            printf( "\n 1st--> %s/%s:%d:%s", cwd1, allf1st[a1].filename,
               allf1st[a1].size, allf1st[a1].tprint );
        }
        d2 = mystat2nd( dir2, allf2nd );
        for ( a2 = 0; a2 < d2; a2++ ) {
            printf( "\n 2nd-->%s/%s:%d^%s", cwd2, allf2nd[a2].filename,
               allf2nd[a2].size, allf2nd[a2].tprint );
        }
        for ( j1 = 0; j1 < d1; j1++ ) {
            for ( j2 = 0; j2 < d2; j2++ ) {
                if ( strcmp( allf1st[j1].filename, allf2nd[j2].filename ) == 0 ) {
                    printf( "identical names:\n %s/%s\n %s/%s", cwd1,
                       allf1st[j1].filename, cwd2, allf2nd[j2].filename );
                }
                if ( allf1st[j1].size = allf2nd[j2].size ) {
                    printf( "\nIsentical size: \n %s/%s:%d\n %s/%s:%d",
                       cwd1, allf1st[j1].filename, allf1st[j1].size, cwd2,
                          allf2nd[j2].filename, allf2nd[j2].size );
                }
                if ( allf1st[j1].filetime == allf2nd[j2].filetime ) {
                    printf( "\nIdentical times: \n %s/%s:%s\n %s/%s:%s",
                       cwd1, allf1st[j1].filename, allf1st[j1].tprint, cwd2,
                          allf2nd[j2].filename, allf2nd[j2].tprint );
                }
            }
        }
        if ( strcmp( key1, "-s" ) != 0 ) {
            for ( j1 = 0; j1 < d1; j1++ ) {
                for ( j2 = 0; j2 < d2; j2++ ) {
                    if ( strcmp( allf1st[j1].filename, allf2nd[j2].filename ) != 0 ) {
                        sprintf( stdf1, "%s/%s", cwd1, allf1st[j1].filename );
                        copyfiles( stdf2, cwd1 );
                        sprintf( stdf2, "%s/%s", cwd2, allf2nd[j2].filename );
                        copyfiles( stdf1, cwd2 );
                    }
                }
            }
        }
        for ( j1 = 0; j1 < d1; j1++ ) {
            for ( j2 = 0; j2 < d2; j2++ ) {
                if ( strcmp( allf1st[j1].filename, allf2nd[j2].filename ) == 0 ) {
                    if ( allf1st[j1].filetime < allf2nd[j2].filetime ) {
                        sprintf( stdf1, "%s/%s", cwd2, allf2nd[j2].filename );
                        copyfiles( stdf1, cwd1 );
                    }
                    if ( allf1st[j1].filetime > allf2nd[j2].filetime ) {
                        sprintf( stdf1, "%s/%s", cwd1, allf1st[j1].filename );
                        copyfiles( stdf1, cwd2 );
                    }
                }
            }
        }
    }
    return 0;
}


void copyfiles( char* file1st, char* file2nd ) {
    pid_t    cpid, wpid;
    int    status;
    cpid = fork();
    if ( !cpid ) {
        execlp( "cp", "cp", file1st, file2nd, NULL );
    }
    wpid = waitpid( cpid, &status, 0 );
}



int mystat1st( char dname[NAME_MAX], struct fileinfo* allf1st ) {
    DIR*                    dir;
    struct dirent*    ent;
    struct stat            st;
    struct fileinfo    inf;
    char                    ttp[NAME_MAX];

    if ( chdir( dname ) == -1 ) {
        perror( "Unable to change directory" );
    }
    if ( ( dir = opendir( "." ) ) == NULL ) {
        perror( "\nUnable to open directory" );
        exit( 1 );
    }
    getcwd( cwd1, NAME_MAX );
    i = 0;
    while ( ( ent = readdir( dir ) ) != NULL ) {
        if ( ( strcmp( ent->d_name, "." ) == 0 ) || ( strcmp( ent->d_name, ".." ) == 0 ) ) {
            continue;
        } {
            if ( stat( ent->d_name, &st ) == 0 ) {
                if ( S_ISREG( st.st_mode ) ) {
                    strcpy( allf1st[i].filename, ent->d_name );
                    allf1st[i].size = st.st_size;
                    allf1st[i].filetime = st.st_atime;
                    sprintf( ttp, "%s", ctime( &st.st_atime ) );
                    strcpy( allf1st[i].tprint, ttp );
                    i++;
                }
            }
        }
    }
    return i;
}

int mystat2nd( char dname[NAME_MAX], struct fileinfo* allf2nd ) {
    DIR*                    dir;
    struct dirent*    ent;
    struct stat            st;
    struct fileinfo    inf;
    char                    ttp[NAME_MAX];
    if ( chdir( dname ) == -1 ) {
        perror( "Unable to change directiry" );
    }
    if ( ( dir = opendir( "." ) ) == NULL ) {
        perror( "\nUnable to open directory" );
        exit( 1 );
    }
    getcwd( cwd2, NAME_MAX );
    i = 0;
    while ( ( ent = readdir( dir ) ) != NULL ) {
        if ( ( strcmp( ent->d_name, "." ) == 0 ) || ( strcmp( ent->d_name, ".." ) == 0 ) ) {
            continue;
        } {
            if ( stat( ent->d_name, &st ) == 0 ) {
                if ( S_ISREG( st.st_mode ) ) {
                    strcpy( allf2nd[i].filename, ent->d_name );
                    allf2nd[i].size = st.st_size;
                    allf2nd[i].filetime = st.st_atime;
                    sprintf( ttp, "%s", ctime( &st.st_atime ) );
                    strcpy( allf2nd[i].tprint, ttp );
                    i++;
                }
            }
        }
    }
    return i;
}

void aboutprg( void ) {
    printf( "\n\t\t SVETA" );
}



Это сообщение отредактировал(а) andrew_121 - 11.3.2008, 23:00


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 11.3.2008, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



sveta_2000, Приведи пример аргументов командной строки.... Их должно быть 4-ри...

Это сообщение отредактировал(а) andrew_121 - 11.3.2008, 22:56


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 12.3.2008, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Возможные ключи:
в качестве первого ключа:
-h - вывод слова SVETA
-s - х.з. что.
в качестве второго ключа:
-x - вывод слова SVETA и выход

итого, чтобы программа полноценно заработала нужно запустить ее с 4-мя параметрами. Первый может быть любой, кроме -h. Причем, -s на что-то повлияет, второй должен быть не -x, третий и четвертый - пути к каталогам.
PM   Вверх
andrew_121
Дата 12.3.2008, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



bsa, Молодца, мне не хотелось на авось тыкаться...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 12.3.2008, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Код

d1 = mystat1st( dir1, allf1st ); // <<<<<<<<<<<<<<<<<<<<<<<<
for ( a1 = 0; a1 < d1; a1++ ) {
    printf( "\n 1st--> %s/%s:%d:%s", cwd1,
        allf1st[a1].filename, allf1st[a1].size, allf1st[a1].tprint );
}
d2 = mystat2nd( dir2, allf2nd ); // <<<<<<<<<<<<<<<<<<<<<<<<
for ( a2 = 0; a2 < d2; a2++ ) {
    printf( "\n 2nd-->%s/%s:%d^%s", cwd2,
        allf2nd[a2].filename, allf2nd[a2].size, allf2nd[a2].tprint );
}

Вот заметил один ОЧЕНЬ интересный момент:
ф-ции: mystat1st, mystat2st - в реализации абсолютно идентичны, почему-бы не использовать только одну из них с разными аргументами ??? А вторую можно вопще удалить...

Добавлено @ 01:56
Изменил реализацию:
Код

void copyfiles( char* file1st, char* file2nd ) {
    pid_t    cpid, wpid;
    int    status;
    cpid = fork();
    if ( !cpid ) {
        execlp( "cp", "cp", file1st, file2nd, NULL );
    }
    wpid = waitpid( cpid, &status, 0 );
}

На:
Код

int copyfiles( char* file1st, char* file2nd ) {
   int rd = 0;
   FILE *fin = NULL, *fout = NULL;
   char* buf = (char*)malloc( BUFSIZE + 1 );
   if ( !buf ) {
      printf( "Memory allocation error !!!\n" );
      return 1;
   }
   fin = fopen( file1st, "rb" );
   if ( !fin ) {
      printf( "Can'not open file: %s\n", file1st );
      free( buf );
      return 1;
   }
   fout = fopen( file2nd, "wb" );
   if ( !fout ) {
      printf( "Can'not open file: %s\n", file2nd );
      free( buf );
      fclose( fin );
      return 1;
   }

   while ( (rd = fread( buf, 1, BUFSIZE, fin )) > 0 ) {
      if ( fwrite( buf, 1, rd, fout ) != rd ) {
         printf( "Unable to write to file !\n" );
         free( buf );
         fclose( fin );
         fclose( fout );
         return 1;
      }
   }

   return 0;
}

Теперь по настоящему Си-шная программа...

Добавлено @ 02:01
sveta_2000: Как-то не видно Вашей заинтересованости, не присутствуете на занятиях...(В смысле - хоть-бы присутствовали на форуме в то время когда Вам пытаются помочь...)

Это сообщение отредактировал(а) andrew_121 - 12.3.2008, 02:17


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 12.3.2008, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Вот еще интересный момент:
Код

struct fileinfo   allf1st[NAME_MAX];
struct fileinfo   allf2nd[NAME_MAX];


Я так полагаю, что если файлов больше чем NAME_MAX
то программе ГЫТ... а ОНЫХ очень часто будет больше...


Добавлено @ 02:13
И еще один момент:
Цитата

короче проблема в том что есть уже готовая программа

Кто же написал ТАКУЮ с позволения сказать - ПРОГРАММУ ???


Это сообщение отредактировал(а) andrew_121 - 12.3.2008, 02:18


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0585 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.