有没有办法只使用c ++找到最旧的文件

时间:2012-03-09 23:03:04

标签: c++ linux file-io

在Linux上。

我想构建一个文件缓冲区。每30分钟保存一个新文件。但允许的文件总数为'n'。

因此,当创建'n + 1'文件时,必须删除最旧的文件。

我发现'dirent.h'和'struct stat'之类的东西可以帮助访问目录,列出所有文件并获取其属性。

struct stat不会给出创建时间,但只是 - 上次修改,上次访问,上次状态更改时间http://pubs.opengroup.org/onlinepubs/7908799/xsh/sysstat.h.html

请帮助。

P.S:现在无法提升。

2 个答案:

答案 0 :(得分:3)

在Linux上,没有文件创建时间与文件系统元数据中的文件一起保存。有一些接近它,但不一样: inode修改时间(这是st_ctime的{​​{1}}成员)。来自struct stat手册页:

  

通过写入或设置inode来更改字段st_ctime   信息(即所有者,组群,链接数,模式等)。

只要,因为您不修改这些属性而不写(超过零字节)到文件 - stat是你的“文件创建时间”。

答案 1 :(得分:1)

我需要一个删除给定目录中最旧文件的函数。我使用了系统回调函数并在C中编写了代码。您可以从C ++中调用它。

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

void directoryManager(char *dir, int maxNumberOfFiles){
DIR *dp;
struct dirent *entry, *oldestFile;
struct stat statbuf;
int numberOfEntries=0;
time_t t_oldest;
double sec;

time(&t_oldest);
//printf("now:%s\n", ctime(&t_oldest));
if((dp = opendir(dir)) != NULL) {
   chdir(dir);
   while((entry = readdir(dp)) != NULL) {
      lstat(entry->d_name, &statbuf);       
      if(strcmp(".",entry->d_name) == 0 || strcmp("..",entry->d_name) == 0)
         continue;
      printf("%s\t%s", entry->d_name, ctime(&statbuf.st_mtime));
         numberOfEntries++;
      if(difftime(statbuf.st_mtime, t_oldest) < 0){
            t_oldest = statbuf.st_mtime;
         oldestFile = entry;
      }
  } 
}       

//printf("\n\n\n%s", oldestFile->d_name);
if(numberOfEntries >= maxNumberOfFiles)
   remove(oldestFile->d_name);

//printf("\noldest time:%s", ctime(&t_oldest));
closedir(dp);
}

int main(){
    directoryManager("/home/myFile", 5);
}