2015-02-11 3 views
0

Я работаю над пользовательской версией cp, где аргументы представляют собой два каталога, а файлы из первого каталога копируются ко второму. Моя текущая проблема заключается в том, чтобы открыть файлы в первом каталоге. Когда я добираюсь до части «открытых файлов» кода, я получаю сообщение об ошибке, что нет файла, что не имеет смысла, потому что имя файла печатается в ошибке. Я что-то пропустил? Я думаю, что я включил достаточно кода.Не удается открыть файл в cp-программе

int main(int ac, char *av[]) {  

int  in_fd, out_fd, n_chars; 
char buf[BUFFERSIZE]; 
struct stat sb; 
DIR *copyFrom; 
DIR *copyTo; 
struct dirent *ep; 

/* open dirs */ 
copyFrom = opendir(av[1]); 
copyTo = opendir(av[2]); 

while(ep = readdir(copyFrom)) 
{ 
    /* open files */ 
    if ((in_fd=open(ep->d_name, O_RDONLY)) == -1) 
     oops("Cannot open", ep->d_name); 

    if ((out_fd=creat(ep->d_name, COPYMODE)) == -1) 
     oops("Cannot create", ep->d_name); 

    /* copy files */ 
    while ((n_chars = read(in_fd , buf, BUFFERSIZE)) > 0) 
     if (write(out_fd, buf, n_chars) != n_chars) 
      oops("Write error to ", av[2]); 

    if (n_chars == -1) 
     oops("Read error from ", av[1]); 

    /* close files */ 
    if (close(in_fd) == -1 || close(out_fd) == -1) 
     oops("Error closing files",""); 
} 
} 
+0

откуда ау [] получить определенный? – user3629249

+0

Это в основном. Я отредактирую это. – uberpirate

ответ

1

DIR запись вернулась из readdir возвращает только базовое имя файла. Вам нужно объединить это с каталогом, чтобы правильно открыть файлы.

Что-то вроде этого:

char srcfile[1024]; 
sprintf("%s/%s", av[1], ep->d_name); 
if ((in_fd=open(srcfile, O_RDONLY)) == -1) 
     oops("Cannot open", srcfile); 
+1

Или измените рабочий каталог, также OP должен проверить, возвращается ли 'opendir()' NULL'. –

+0

Оба утверждения верны - я просто пытался указать ему в правильном направлении. – user590028

+0

и вы сделали я думаю. –

Смежные вопросы