【问题标题】:C++: Getting size of all files inside current directoryC ++:获取当前目录中所有文件的大小
【发布时间】:2017-06-01 06:33:03
【问题描述】:

我是 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;
}

【问题讨论】:

标签: c++ filesize


【解决方案1】:

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) 函数返回一个以d_name 结尾的struct dirent 指针;您可能想跳过... 的两个条目(因此使用strcmp(3)"."".." 进行比较,或者进行比较困难的方式)。然后,您将使用字符串连接构建完整的文件路径。您可以使用(在真正的 C++ 中)std::string,或者您可以使用snprintf(3)asprintf(3)。如果你readdir当前目录.你可以直接在d_name字段上调用stat(2)

顺便说一句,exit(-1) 不正确(当然味道也很差)。见exit(3)。一个更具可读性的替代方案是exit(EXIT_FAILURE)

【讨论】:

猜你喜欢
  • 2015-01-05
  • 2012-10-28
  • 2012-08-11
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多