Сканирование каталога, чтобы найти файлы, на которые указывают программные ссылки - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь выполнить это упражнение для своего класса «Операционные системы»: я должен пропустить определенный каталог через командную строку, чтобы найти в нем любые файлы, на которые указывают программные ссылки.

Это то, что ясделано:

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

int main(int argc, char *argv[])
{

 DIR *dir_ptr;
 struct dirent *dir_str;
 struct stat buf;
 struct stat buf2;

 if(argc!=2)
 {
  printf("Error! I need a directory.\n");
  exit(-1);
 }


 if((dir_ptr=opendir(argv[1]))==NULL)       
 {
  printf("Opendir error: %s\n", strerror(errno));
  exit(-1);
 }

 while((dir_str=readdir(dir_ptr))!=NULL)
 {
  lstat(dir_str->d_name, &buf);     
  if(S_ISLNK(buf.st_mode))
  {
   stat(dir_str->d_name, &buf2);
   printf("'%s' points to a file of %ld bytes.\n", dir_str->d_name, buf2.st_size);
  }

 }

 closedir(dir_ptr);
 exit(0);

}

Теперь вот моя проблема: эта программа просто записывает в стандартный вывод все программные ссылки, которые указывают на файл определенного размера.Вместо этого мне нужно, чтобы он распечатывал все файлы, на которые указывает мягкая ссылка.Во-вторых, странно, что эта программа работает, только если каталог не требуется, я имею в виду получение текущего каталога с getcwd() и передачу возвращенного пути к opendir().Этот факт даже не печатает все программные ссылки в переданном каталоге.

Заранее спасибо!Любая помощь будет принята с благодарностью.

РЕДАКТИРОВАТЬ: Давайте предположим, что у нас есть этот каталог с именем "my_directory" с этими файлами:

justatext.txt
softlink1 (it points to justatext.txt)
justanothertext.txt
softlink2(it points to justanothertext)

Когда я передаю "my_directory" через командную строку (./a.out my_directory), я хочу, чтобы программа записывала в стандартный вывод "justatext.txt" и "justanothertext.txt", поскольку эти файлы в каталоге указываются программными ссылками.Если я передам этот каталог моей программе, выходные данные не будут напечатаны.

1 Ответ

0 голосов
/ 16 июня 2018

ОК, думаю, я решил свою проблему.Подводя итог всем советам в комментариях, это то, что я сделал, и это похоже на работу:

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

int main(int argc, char *argv[])
{

 DIR *dir_ptr;
 struct dirent *dir_str;
 struct stat buf;
 struct stat buf2;
 char *buf3;            
 ssize_t nbyte, bufsize;
 int flag=0;

 if(argc!=2)
 {
  printf("Error! I need a directory.\n");
  exit(EXIT_FAILURE);
 }

 if((dir_ptr=opendir(argv[1]))==NULL)
 {
  printf("Opendir error: %s\n", strerror(errno));
  exit(EXIT_FAILURE);
 }

 chdir(argv[1]);    

 while((dir_str=readdir(dir_ptr))!=NULL)    
 {
  lstat(dir_str->d_name, &buf);     
  bufsize=buf.st_size+1;    
  if(buf.st_size==0)        
   bufsize=PATH_MAX;        

  buf3=malloc(bufsize); 
  if(buf3==NULL)
  {
   perror("malloc");
   exit(EXIT_FAILURE);
  }
  nbyte=readlink(dir_str->d_name, buf3, bufsize);   

  if(S_ISLNK(buf.st_mode))  
  {
   stat(dir_str->d_name, &buf2);
   printf("%s is a file of %ld bytes pointed by a symbolic link (%s).\n", buf3, buf2.st_size, dir_str->d_name);
   flag+=1;
  }

 }

 if(flag==0)
  printf("No files pointed by a syslink found in this directory!\n");

 free(buf3);
 closedir(dir_ptr);
 exit(0);

}

Прежде всего, я использовал chdir(), чтобы изменить текущий каталог с помощью пропущенной командылиния;затем я реализовал readlink(), чтобы получить имя пути в символической ссылке, названной в качестве аргумента.Также я использовал exit(EXIT_FAILURE), чтобы закрыть программу в случае ошибки.

Я не знаю, является ли это полностью правильным.Пожалуйста, дайте мне знать, если это не так!

...