【问题标题】:C - size of a file from an absolute pathC - 来自绝对路径的文件大小
【发布时间】:2015-08-31 18:57:38
【问题描述】:

问题:当文件路径相对到当前工作目录时,有没有办法通过绝对文件路径获取文件大小为off_t不知道

这很可能被标记为重复,但我相信它与 thisthis 等问题有很大不同,因为我不希望使用相对路径。

像许多人一样 - 它似乎 - 我陷入了假设在寻找文件信息时 stat() 使用 absolute 而不是 relative 的陷阱(对于当前工作目录)路径名。我有一个文件的绝对路径,我需要将其大小标识为off_t。我发现的第二个问题是绝对路径名——除了指向错误的地方——也可能超过PATH_MAX from limits.h?。

下面的函数here 提供了一种获取具有相对路径的off_t 的方法。但是这显然会通过 errno 以绝对路径返回 No such file or directory,因为它使用 stat()

#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

off_t fsize(const char *filename) {
    struct stat st;

    if (stat(filename, &st) == 0)
        return st.st_size;

    fprintf(stderr, "Cannot determine size of %s: %s\n",
            filename, strerror(errno));

    return -1;
}

因为我知道有人会问;我被告知chdir() 既不是线程安全的也不是好的做法;我应该避免更改当前工作目录。我还被建议避开fseek(),但没有给出理由说明为什么......

【问题讨论】:

  • 还有……你在问什么? stat() 确实适用于绝对路径!
  • 啊...我肯定很困惑。
  • path 完全不相关。可能有两个或多个目录条目指向同一个 inode。 (甚至零链接: fstat() 可以给出甚至没有目录条目的文件描述符的大小)
  • 我建议您查看fstatat(),它提供绝对路径和相对路径,并消除了chdir() 的必要性。
  • 最可能的原因:路径名中的尾随空格或 CR。 (或者为了更有趣:backspace

标签: c stat


【解决方案1】:

stat(2) 允许您使用来自当前目录的根目录(如果路径以/ 开头)或相对路径(否则,请参阅path_resolution(7))的完整路径名指定文件。即使您不知道任何名称(如果您只有一个打开的文件描述符,并且您不知道该文件的名称),您也可以进行fstat(2) 系统调用。

请注意文件大小可能会在您拨打stat(2) 以了解文件大小以及之后可以执行的任何操作之间发生变化这一事实。如果你想确保你的写作不会被其他人所干扰,请考虑使用O_APPEND 标志打开。

【讨论】:

  • Good edit Basile,对 path_resolution 的引用是完成此答案的最佳补充。感谢您的编辑。
  • 虽然我的问题很糟糕,但对于理解stat()fstat() 最有帮助的是我最终使用的。
  • @Chortle,还有另一种使用lseek(2) 获取文件大小的方法,但它的缺点是需要打开文件描述符(不是您在问题中要求的路径名)所以我没有别提了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2012-02-03
  • 2016-06-02
  • 2018-04-11
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
相关资源
最近更新 更多