C ++:获取当前目录

时间:2017-06-01 06:33:03

标签: c++ filesize

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

1 个答案:

答案 0 :(得分:2)

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)&amp;循环readdir(3)(以及后来的closedir)。

获得文件路径后,您使用stat(2)获取该文件的元数据,包括其大小(字段st_size)。 BTW /bin/ls/usr/bin/find程序使用它。

readdir(3)函数返回以struct dirent结尾的d_name指针;您可能希望跳过...的两个条目(因此请使用strcmp(3)"."".."进行比较,或者进行比较)。然后,您将使用字符串连接构建完整的文件路径。您可以使用(在真正的C ++中)std::string,或者可以使用snprintf(3)asprintf(3)。如果您readdir当前目录.,则可以直接在d_name字段上致电stat(2)

BTW exit(-1)不正确(当然味道不佳)。见exit(3)。更可读的替代方案是exit(EXIT_FAILURE)