【问题标题】:Finding file size with c++使用 C++ 查找文件大小
【发布时间】:2013-01-30 19:44:38
【问题描述】:

更多的问题,我真的很困惑,而且一直困扰着我,我几乎用 dirent.h 尝试了所有的东西。但这是我想要的一个例子:

#include <iostream>
#include "DataEventResponseMsg.idl"
using namespace std;

int main(){
    cout << "This is the size: " << sizeof(DataEventResponseMsg) << endl;
    return 0;
}

所做的是包含该特定文件并找到它的大小并打印它。我想这样做,但我需要它来打开一个充满 .idl 文件的目录并使用 sizeof.. 打印它是哪个文件以及它的大小。

我尝试使用dirent.h并打开目录,并将内容放入ent->d_name,然后查找d_name的大小等,但所做的只是打印文件的大小指针..我尝试将文件放入数组中,但执行 sizeof 只打印数组的大小。我希望它打印实际文件的大小,就好像我将它们包含在我发布的头文件中一样..

这可能吗?我很困惑,我需要让它工作,但我需要帮助。

请帮忙。

编辑 ------

所以我用 dirent.h 完成了这个:

#include <iostream>
#include <dirent.h>
#include <string.h>
#include <fstream>

using namespace std;

int main( int argc, char* argv[] ){
char FileArr[20][256];
DIR *dir;
FILE *fp;
int i = 0;
int k;
struct dirent *ent;

dir = opendir (argv[1]);
if( dir != NULL ){
    while(( ent = readdir ( dir ) ) != NULL ){
        strcpy( FileArr[i], ent->d_name );
        fp = fopen( FileArr[i], "rw" );
        cout << FileArr[i] << ", " << sizeof(FileArr[i]) << endl;
        fclose(fp);
        i++;
    }
    closedir( dir );
}
return 0;
}

这从命令行打开了目录,并将内容放入 ent->d_name,我将这些字符串复制到一个数组中,并尝试查找数组中所有内容的大小。但是,执行 sizeof 只会计算指针的数组大小(如果我使用了指针)。我想找到实际文件的大小,而不是任何保存文件字符串/名称的东西。

【问题讨论】:

  • 使用stat(2) 获取文件大小。
  • sizeof 根本不适合这个东西; dirent.h 方向有点正确。查看_stat / _stat64 / stat ...(或Windows 上的GetFileSizeEx
  • 你能看看我的编辑吗?我以前用 dirent.h 做过一些事情,但它并没有按照我想要的方式工作..
  • 好的,现在我看到了你想要实现的目标。嗯,我认为不以某种方式解析文件是不可能的。 @chakolatemilk 也许您应该将问题标题编辑为“确定文件中包含的结构的大小”
  • @lethal-guitar,是的,我害怕那个.. :(

标签: c++ printing header filenames filesize


【解决方案1】:

有几种方法可以在 C++ 中获取文件的大小。一种方法是寻找文件末尾,然后询问文件指针的位置:

ifstream file("filename.idl", ios::in);
file.seekg(0, ios::end);
auto fileSize = file.tellg();

这甚至在此页面上作为示例给出:

http://www.cplusplus.com/reference/istream/istream/tellg/

除此之外,还有其他(特定于操作系统的)解决方案,如 cmets 中指出的那样,但无论您的平台如何,这种方法都应该有效。

【讨论】:

  • 我知道这一点,我已经这样做了。但我要避免的是必须手动键入代码中的每个文件。我希望代码打开一个目录并查看每个文件并打印出文件名及其大小。 ://
【解决方案2】:

提供的答案 lethal-guitar 是一种很好的独立于操作系统的获取文件大小的方法,只要您已经知道目录中有哪些文件。如果您不知道目录中有哪些文件,那么您将回到使用特定于平台的工具,例如,dirent for Linux,正如您所建议的那样。下面是一个如何使用dirent的简单示例:

#include <stdio.h>
#include <dirent.h>
#include <sys/stat.h>

int main(int argc, char *argv[]) {
    struct stat file_stats;
    DIR *dirp;
    struct dirent* dent;

    dirp=opendir("."); // list files in the current directory (replace with any other path if you need to)
    do {
        dent = readdir(dirp);
        if (dent)
        {
            printf("  file \"%s\"", dent->d_name);
            if (!stat(dent->d_name, &file_stats))
            {
                printf(" is size %u\n", (unsigned int)file_stats.st_size);
            }
            else
            {
                printf(" (stat() failed for this file)\n");
            }
        }
    } while (dent);
    closedir(dirp);
}

【讨论】:

  • 好的,这真的很好用。这几乎是我想要的..但​​是你看..我试图找到大小的.idl文件..我试图找到结构的大小,而不是实际的文件字节..哪个这就是我使用 sizeof 的原因,因为我在上面的主题中发布的第一个代码,它找到了特定 .idl 的结构的大小,它是 80.. 我希望能够对 .idl 的其余部分执行此操作。我拥有的 idl 文件.. 有点奇怪,我知道..
  • @chakolatemilk - 什么是 .idl 文件?里面有什么?
  • OS Windows 的接口定义文件。但是,在 idl 中,只有 1 或 2 个结构,每个结构中约有 3 或 4 个变量。当我在其中使用 sizeof() 时,它应该显示结构的大小而不是整个 .idl 的大小(以字节为单位)。我希望你能理解我要问的问题。
  • @chakolatemilk - 您不能将 dirent() 与 sizeof() 结合使用来执行此操作。 dirent() 是一个运行时函数,它在运行时读取一个目录; sizeof() 总是在编译时解析为一个常量。也许您可以解析 .idl 文件的内容以获取其中变量的类型,然后计算每个变量的大小。或者,创建一个 .cpp 源文件,每个 .idl 文件一个,并使用您的 #include 和 sizeof() 构造以这种方式显示大小。您的 main() 需要在每个 .cpp 文件中调用一个函数来打印其对应 .idl 文件的结果。
  • @chakolatemilk - 虽然我的代码示例和答案并不完全符合您的需要,但它们确实按照说明回答了您的问题,因为它们确实为您提供了文件及其大小。希望我上面的 cmets 也有助于指导您找到您实际需要的解决方案。如果您确实发现它们有帮助,请同时投票并选择我的答案。如果您需要进一步的帮助,请告诉我。
猜你喜欢
  • 2011-08-10
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
  • 2010-11-11
相关资源
最近更新 更多