用lseek在C中获取文件的大小?

时间:2014-04-26 04:14:26

标签: c memory struct filesize lseek

我正在尝试使用以下操作获取C中文件的大小...我是C

的新手

这是我文件顶部的struct mem:

struct mem {size_t size;
            };

这是使用局部变量/返回语句设置的正确吗?

struct mem* fileSize(char* filename)
{
    currentPos = lseek(filename, (size_t)0, SEEK_CUR);
    size = lseek(filename, (size_t)0, SEEK_END);
    lseek(filename, currentPos, SEEK_SET);   // seek back to the beginning of file
    return size;
}

3 个答案:

答案 0 :(得分:2)

从可以观察到的情况来看,也许您想知道如何将文件大小传递回来自' mem'结构(你自己设计)。这当然是可能的;但是' fileSize()'功能将必须提供存储器,以便返回这个' mem'结构。也许是这样的事情:

struct mem* fileSize(char* filename)
{
   struct mem *m = malloc(sizeof(*m));

添加上面的行以分配合适大小的内存。

...也许是一个小小的过度... lseek()没有采用文件名作为它的第一个参数。相反,它需要一个'文件描述符',可以通过实现' open()'来获取(来自文件名):

   int fd = open(filename, O_RDONLY);

现在,fd可以传递给' lseek()'而不是文件名。

   off_t currentPos = lseek(fd, (size_t)0, SEEK_CUR);
   m->size = lseek(fd, (size_t)0, SEEK_END);

'米'是一个结构mem *'您现在可以存储尺寸。

   lseek(fd, currentPos, SEEK_SET);   // seek back to the beginning of file

完成后不要忘记关闭文件:

   close(fd);

   return(m);

分配和初始化的' m'返回给调用者(m-> size)。

}

调用者(fileSize)应该免费()'完成后使用(struct mem)内存以防止内存泄漏。

答案 1 :(得分:0)

您可以使用POSIX函数stat(2)直接查找文件的大小。如果您只想使用标准C库函数,则应使用fseek(3)ftell(3)

答案 2 :(得分:0)

lseek()无法使用文件名。它需要一个整数文件句柄。请尝试使用stat()。另外,不要使用指针返回值。像这样:

size_t fileSize(char* filename)
{
    size_t rv = 0;  // I like to return 0, if badness occurs
    struct stat  file_info;

    if ( (filename != NULL) && (stat(filename,&file_info) == 0) )  //NULL check/stat() call
      rv = (size_t)file_info.st_size;  // Note: this may not fit in a size_t variable

  return rv;
}