C++:获取的所有文件的大小当前目录

问题描述:

我是新的C++编程,而我努力的练习文件读写内。我正在尝试获取当前目录中所有文件的大小。事情是,在获取当前目录中文件的名称后,我将它们放在文本文件中。所以现在我被卡住了,不知道该从哪里出发。C++:获取的所有文件的大小当前目录

#include <iostream> 
#include <fstream> 
#include <algorithm> 

using namespace std; 

       // FILE FUNCTION 

void fileStuff(){ 

} 

       // MAIN FUNCTION 

int main(int argc, char const *argv[]) 
{ 
// ERROR CHECKING 
if(argc != 3){ // IF USER DOESN'T TYPE ./nameOfFile, AND THE OTHER REQUIRED ARGUMENTS. 

    cout << "Incorrect. Try Again" << endl; 
    exit(-1); 
} 

ifstream file; 
string fileContents; 

system("find . -type f > temp.txt"); 

file.open("temp.txt"); 

if (!file){ 

    cout << "Unable to open file: temp.txt" << endl; 
    exit(-1); 
} 
while(file){ 

    getline(file, fileContents); 
    cout << fileContents << endl; 
} 

file.close(); 
return 0; 
} 
+2

可能使用C++文件流(fstream),如何确定文件的大小?](https://*.com/questions/2409504/using-c-filestreams -fstream-how-can-you-determine-the-size-of-a-file) – vonludi

+0

你把它们放在一个文本文件中,然后......?你想下一步该做什么? –

+0

将这些文件放入文本文件后,我希望能够输出这些文件的大小。 – notSoExperiencedCoder

C++14(或更早的版本中,特别是C++11)不知道file systemsdirectories(还)。对于C++ 17,请参见file system library。否则,你的代码是特定于操作系统的,但Boost库有一些file system support

我假设你在Linux或一些POSIX系统中运行。

你的程序只使用一个外部命令(find(1));如果你想读取这样的命令,你可以使用popen(3)pclose,那么你将不需要临时文件。顺便说一句,你可以使用find . -type f -ls

不过,你不需要使用外部命令,它是更安全,速度更快,以避免这种情况。

迂腐,文件名可能包含一个换行符,并用你的方法,你将需要特殊情况。一个文件名也可以包含一个制表符(或其他控制字符),在这种情况下,find . -type f的行为是特别的,你也需要特殊情况。在实践中,它的味道极差,在文件名中不太可能具有换行符或制表符,并且您可能会忘记这些奇怪的情况。

你可以使用nftw(3)。你可以递归使用opendir(3) &环上readdir(3)(后来closedir)。

一旦你有一个文件路径,你会使用stat(2)来获取该文件的元数据,包括其大小(字段st_size)。顺便说一下,/bin/ls/usr/bin/find程序使用它。

readdir(3)函数返回一个struct direntd_name结尾的指针;你可能想跳过这两个条目...(因此使用与"."".."比较,或做硬盘的方式比较)。然后你将使用字符串连接建立一个完整的文件路径。您可以使用(在真正的C++)std::string或者你可以使用该snprintf(3)asprintf(3)。如果您readdir当前目录.你可以在d_name场直接调用stat(2)

BTW exit(-1)是不正确的(和口感肯定不好)。请参阅exit(3)。更可读的替代方法是exit(EXIT_FAILURE)

+1

[Boost example](http://boost.2283326.n4.nabble.com/Directory-size-via-boost-filesystem-problem-td2563938.html) – MSalters