Информация о файле UNIX - PullRequest
1 голос
/ 17 апреля 2011

Я пытаюсь создать программу, которая контролирует одну папку и проверяет, были ли какие-либо файлы внутри нее изменены или изменены их содержимое или разрешения.

Мой код здесь:

void verifyChanges(char *directory, int duration, int interval, char *logfile, bool lastModified, bool changedPermissions){

 //Definição de variáveis
int i, j;
int timeint = 0;

char * initialFileList[MAX_LIST_SIZE];
char * finalFileList[MAX_LIST_SIZE];
struct stat initialStats[MAX_STRUCT_SIZE];
struct stat finalStats[MAX_STRUCT_SIZE];

bool found;

FILE *log = fopen(logfile, "a");
while(timeint <= (duration*SECONDS)){

int initialFileNr = getFileNameStats(directory, initialFileList, initialStats);
sleep(interval);
int finalFileNr = getFileNameStats(directory, finalFileList, finalStats);

//Check file names of finalFileList thas does not appear in initialFileList
for (i = 0; i < finalFileNr; i++){
  found = false;
  for (j = 0; j < initialFileNr; j++){
if(strcmp(finalFileList[i], initialFileList[j]) == 0){
  found = true;
  break;
}
  }
  if(!found){
char *time = formatTime(finalStats[i].st_mtime);
char *time_tok = strtok(time, " ");
time_tok = strtok(0, " ");
time_tok = strtok(0, " ");
time_tok = strtok(0, " ");
    //This fprintf does not print the filename. What is wrong??
fprintf(log, "%-15s %-8s %-51s CRE\n", finalFileList[i], time_tok, directory);
fflush(log);
printf("New File Created!!!!!\n");
  }
}

//Same as befor, but this time searching for deleted files
for(i = 0; i < initialFileNr; i++){
  found = false;
  for(j = 0; j < finalFileNr; j++){
if(strcmp(initialFileList[i], finalFileList[j]) == 0){
  found = true;
  break;
}
  }
  if(!found){
char *time = formatTime(initialStats[i].st_mtime);
char *time_tok = strtok(time, " ");
time_tok = strtok(0, " ");
time_tok = strtok(0, " ");
time_tok = strtok(0, " ");
fprintf(log, "%-15s %-8s %-51s DEL\n", initialFileList[i], time_tok, directory);
fflush(log);
printf("Deleted!!!!!\n");
  }
}

//At last, checking if common files on first and second list was modified
for(i = 0; i < initialFileNr; i++){
  for(j = 0; j < finalFileNr; j++){
if(srtcmp(initialFileList[i], finalFileList[j]) == 0){
  //checking content changes
  if((initialStats[i].st_mtime != finalStats[j].st_mtime) && lastModified){
    char *time = formatTime(finalStats[j].st_mtime);
    char *time_tok = strtok(time, " ");
    time_tok = strtok(0, " ");
    time_tok = strtok(0, " ");
    time_tok = strtok(0, " ");
    fprintf(log, "%-15s %-8s %-51s EDI\n", finalFileList[j], time_tok, directory);
    fflush(log);
    printf("Changed Content!!!!!\n");
  }
  //Verificar alterações às permissões
  if((initialStats[i].st_mode != finalStats[j].st_mode) && changedPermissions){
    char *time = formatTime(finalStats[j].st_mtime);
    char *time_tok = strtok(time, " ");
    time_tok = strtok(0, " ");
    time_tok = strtok(0, " ");
    time_tok = strtok(0, " ");
    fprintf(log, "%-15s %-8s %-51s PER\n", finalFileList[j], time_tok, directory);
    fflush(log);
    printf("Changed Permissionss!!!!!\n");
   }
  }
     }
    }
   timeint += interval;
  }
  fclose(log);
}

Я знаю, что этот код не имеет хорошей производительности, но сейчас я хочу, чтобы он работал. У меня есть еще одна функция, которая получает имена файлов и статистику внутри этой папки, но эта функция работает правильно.

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

Заранее благодарим за любую помощь!

приписка

Другая функция, которая получает имя файла и статистику. Здесь что-то не так?

int getFileNameStats(char *directory, char *fileList[], struct stat stats[]){
  int i = 0;
  DIR *dirp;
  struct dirent *direntp;
  struct stat stat_buf;
  char fileName[MAX_DIR_SIZE];

  dirp = opendir(directory);

  while ((direntp = readdir(dirp)) != NULL)
 {
    sprintf(fileName, "%s/%s", directory, direntp->d_name);
    if (lstat(fileName, &stat_buf)==-1){
    perror(fileName);
    exit(3);
 }
 if(strcmp(direntp->d_name,".") && strcmp(direntp->d_name,"..")){
   if (S_ISREG(stat_buf.st_mode)){
 fileList[i] = (char *) malloc(MAX_NAME_SIZE*sizeof(char));
 fileList[i] = direntp->d_name;
 stats[i] = stat_buf;
 printf("%-25s - regular\n", fileList[i]);
 i++;
   }
 }
   }
   closedir(dirp);
   return i; 
  }

Ответы [ 2 ]

5 голосов
/ 18 апреля 2011

Вы не можете сравнивать строки следующим образом:

char * initialFileList[MAX_LIST_SIZE];
char * finalFileList[MAX_LIST_SIZE];
....
if(finalFileList[i] == initialFileList[j]){

Вместо этого используйте strcmp:

if(strcmp(finalFileList[i], initialFileList[j]) == 0){

Просто убедитесь, что все строки не завершены, или используйте strncmp.

Причина, по которой ваш код говорит, что вы создали файл, заключается в том, что ни один из указателей в finalFileList не соответствует ни одному из указателей в initialFileList.

1 голос
/ 18 апреля 2011

Вы не правильно следовали советам в предыдущем ответе. Вы сделали это:

if(strcmp(finalFileList[i], initialFileList[j]))

вместо этого:

if(strcmp(finalFileList[i], initialFileList[j]) == 0)

Пожалуйста, внимательно прочитайте документацию по strcmp (). Если две строки совпадают, возвращается ноль, а не 1.

...