Файлы становятся нулевыми байтами после stat () - PullRequest
1 голос
/ 30 ноября 2011

Я столкнулся со странной проблемой при перечислении файлов в поддереве, которые являются только каталогами или обычными файлами.Файлы перечислены, но размер файлов после их прохождения следующей программой становится равным нулю.Как мне это предотвратить?Это из-за stat ()?

struct list_rec{
    int seqno;
    int path_length;
    char *file_path;
};
FILE *listoffiles;
int no_of_files;/*couter to keep track of files visited*/
static int list_the_files(const char *fpath,const struct stat *sb, int tflag, struct FTW *ftwbuf)
{
  int fd;
  struct list_rec t;
  struct stat buff;

  if(stat(fpath,&buff) == -1)
 printf("Error reading inode");

  /*the file will be listed if it is directory or if it is a regular file and can be   opened for writing*/
  if(S_ISDIR(buff.st_mode)==0)
  {
 //printf("\nIT IS NOT A DIRECTORY %s",fpath);
if(S_ISREG(buff.st_mode)!=0)
{
    //printf("IT IS A REGULAR FILE %s",fpath);
    fd = open  (fpath,O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
    if(fd != -1)
    {
        close(fd);
        no_of_files = no_of_files+1;
        t.seqno = no_of_files;
        t.path_length = strlen(fpath)+1;
        t.file_path = malloc(sizeof(char)*t.path_length);
        strcpy(t.file_path,fpath);

        fwrite(&t.seqno,sizeof(int),1,listoffiles);
        fwrite(&t.path_length,sizeof(int),1,listoffiles);
        fwrite(t.file_path,sizeof(char)*t.path_length,1,listoffiles);

        free(t.file_path);
    }
    else
        printf("\n is regular but could not open %s",fpath);
}
else
    printf("\nNot a regular file %s",fpath);    
 }
 else
 {
    no_of_files = no_of_files+1;
t.seqno = no_of_files;
t.path_length = strlen(fpath)+1;
t.file_path = malloc(sizeof(char)*t.path_length);
strcpy(t.file_path,fpath);

fwrite(&t.seqno,sizeof(int),1,listoffiles);
fwrite(&t.path_length,sizeof(int),1,listoffiles);
fwrite(t.file_path,sizeof(char)*t.path_length,1,listoffiles);

free(t.file_path);
  }
 return 0;
 }

 int main(int argc, char *argv[])
 {
   listoffiles = fopen("/home/juggler/files.txt","w+b");
   no_of_files = 0;
   ftw(argv[1],list_the_files,20);
   fwrite(&no_of_files,sizeof(int),1,listoffiles);//Writing the total number of    records at the end of the file
  }

Спасибо.Помощь будет высоко ценится

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Вы открываете файлы с O_WRONLY и O_TRUNC, которые усекают файл до 0 длины. Вы, вероятно, просто хотите O_RDONLY.

2 голосов
/ 30 ноября 2011

Нет, это потому, что вы открываете файл с помощью O_TRUNC, который усекает его до нуля байтов.

Если вы хотите проверить, можно ли открыть файл для записи, используйте:

if (access(fpath, W_OK) == 0) {
    /* file can be opened for writing */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...