Member 13010616 Ответов: 2

Как распечатать имя файла и размер файла на экране консоли


Кажется, я уже близко. Когда я пытаюсь это сделать
"filename = file[i];"
Я получаю ошибку.
|51|error: no matching function for call to 'std::__cxx11::basic_string<char>::basic_string(std::vector<std::__cxx11::basic_string<char> >&)'|


Что я уже пробовал:

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <vector>

using namespace std;

int getdir (string dir, vector<string> &files)
{
    DIR *dp;
    struct dirent *dirp;
    if((dp  = opendir(dir.c_str())) == NULL) {
        cout << "Error(" << errno << ") opening " << dir << endl;
        return errno;
    }

    while ((dirp = readdir(dp)) != NULL) {
        files.push_back(string(dirp->d_name));
    }
    closedir(dp);


}



long fileLength (const char * name);
__int64 FileSize(std::string name);
const char * filename;
int main()
{



std::ofstream outputFile;
outputFile.open("Files.txt");
    string dir = string(".");
    vector<string> files = vector<string>();

    getdir(dir,files);

    for (unsigned int i = 0;i < files.size();i++) {

filename = file[i]; //issue here
        cout << files[i]  <<"Size of " << filename << " is " << FileSize(filename) << " bytes." << endl;



    }
ifstream file (filename, ios::in|ios::binary);
    file.seekg (0, ios::end);
    return file.tellg();
    return 0;
}


long fileLength (const char * name)
{

}

__int64 FileSize(std::string name)
{
    HANDLE hFile = CreateFile(name.c_str(), GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile==INVALID_HANDLE_VALUE)
        return -1; // error condition, could call GetLastError to find out more

    LARGE_INTEGER size;


    CloseHandle(hFile);
    return size.QuadPart;
}

2 Ответов

Рейтинг:
1

Richard MacCutchan

Вы уже дважды отправляли этот вопрос, смотрите Как вывести каталог файлов и размер файла в txt-файл?[^Пожалуйста, не перепечатывайте один и тот же вопрос.

Что касается вашей ошибки кода:

filename = file[i]; // what is file supposed to refer to?
        cout << files[i]  <<"Size of " << filename << " is " << FileSize(filename) << " bytes." << endl;



    }
// and here you define file as an input stream ???
ifstream file (filename, ios::in|ios::binary);
    file.seekg (0, ios::end);
    return file.tellg();
    return 0;

Похоже, вы путаете имена переменных (и их типы), дублируете код без всякой причины и вызываете функции, которые вы не определили. Немного более тщательная проверка стола может оказаться полезной.


Рейтинг:
0

Jochen Arndt

Я ожидал бы другой ошибки, потому что она должна быть files[i] (имя переменной имеет конечную букву "s").

Однако ваш вектор хранит std::string значения пока filename иметь тип const char* Таким образом, вы должны использовать string::c_str - ссылка на C++ [^] метод:

filename = files[i].c_str(); 

Для получения размера файла я предлагаю использовать один из следующих способов: _stat, _stat32, _stat64, _stati64, _stat32i64, _stat64i32, _wstat, _wstat32, _wstat64, _wstati64, _wstat32i64, _wstat64i32[^] методы.


[no name]

Я попробовал файлы[i].c_str()
Он приходит с вектором ошибок, у которого нет члена с именем 'c_str'

Jochen Arndt

Тогда попробуй files.at(i).c_str().