检查文件的修改日期

时间:2009-12-31 11:42:45

标签: c

我正在检查文件是否已被修改以刷新内容... 但是,我需要一些改进:

  • 如何测试stat的返回值以判断它是否失败?
  • 返回的errno数字可能会在glibc版本之间发生变化,对吧?在这种情况下,执行errno==是没用的......我该如何解决?

int is_refreshing_needed (char * path)
{
    int refresh_content;
    struct stat file;
    stat(path, &file);
//File does not exist or Permission Denied or the file has not been modified
    if( errno == 2 || errno == 13 || file.st_atime > file.st_mtime ) {  
        refresh_content=0;
    }
    else { 
        refresh_content=1;  
    }
    return refresh_content; 
}

6 个答案:

答案 0 :(得分:1)

我系统上stat(2)的手册页说明:

RETURN VALUES
     Upon successful completion, the value 0 is returned; otherwise the
     value -1 is returned and the global variable errno is set to indicate the
     error.

您必须检查对stat()的呼叫的返回值,以确定呼叫是成功还是失败。所以:

if (stat(path, &file) != 0) {
    return 0;
}

答案 1 :(得分:1)

以下是man page的错误值列表:

  

EACCES 拒绝搜索权限   路径中的一个目录   路径前缀。

     

EBADF filedes不好。

     

EFAULT 地址错误。

     

ELOOP 符号链接太多   在遍历路径时遇到。

     

ENAMETOOLONG 文件名太长了。

     

ENOENT 路径路径的一个组件   不存在,或路径是   空字符串。

     

ENOMEM 内存不足(即内核   存储器)。

     

ENOTDIR 路径的组件不是   目录。

使用此常量而不是数值。

答案 2 :(得分:0)

您应该使用常量(因为它们在stat.h中定义):

  

如果出现以下情况,stat()函数将失败:

   EACCES Search permission is denied for a component of the path prefix.

   EIO    An error occurred while reading from the file system.

   ELOOP  A loop exists in symbolic links encountered during resolution of 
          the path argument.

   ENAMETOOLONG
          The length of the path argument exceeds {PATH_MAX} or a pathname
          component is longer than {NAME_MAX}.

   ENOENT A component of path does not name an existing file or path is an 
          empty string.

   ENOTDIR
          A component of the path prefix is not a directory.

   EOVERFLOW
          The file size in bytes or the number of blocks allocated to the file
          or the  file serial number cannot be represented correctly in the 
          structure pointed to by buf.

   The stat() function may fail if:

   ELOOP  More  than  {SYMLOOP_MAX}  symbolic  links were encountered during 
          resolution of the path argument.

   ENAMETOOLONG
          As a result of encountering a symbolic link in resolution of the 
          path argument, the length of the substituted pathname string 
          exceeded {PATH_MAX}.

   EOVERFLOW
          A value to be stored would overflow one of the members of the stat 
          structure.

来自man -s3 stat

答案 3 :(得分:0)

当stat失败时,它返回-1;>

所以

if (stat() == -1)
    // stat fail
else
    // can refresh if needed

答案 4 :(得分:0)

“man stat”是你的朋友。这来自手册页的“返回值”部分:

“成功完成后,返回0。否则,返回-1并设置errno以指示错误。”

返回值包括: EOI,EOVERFLOW,EACCESS,EFAULT 还有其他人。这些错误是stat()系统调用的错误,会随gcc / glibc版本而改变。

要访问错误信息,您需要包含

#include <errno.h>

并且您可以使用perror()函数来获取错误文本(对于perror()声明,您需要#include <stdio.h>)。有关更多信息,请参阅“man perror”。

另外,请不要使用像2这样的数字(没有这样的文件或目录)和13(权限被拒绝)。请使用#define'ed名称使代码更易于阅读。

祝你好运!

答案 5 :(得分:0)

您无需检查函数中errno的值:只需检查stat()的返回值并让调用者处理特定错误,例如

errno = 0;
is_refreshing_needed("foo");
if(errno) switch(errno)
{
    case ENOENT:
    puts("file not found");
    break;

    /* ... */

    default:
    puts("unexpected error condition");
}