Windows 下最本质的做法,是直接调用 Windows API,解决你的这个问题,需要三个 API 函数:
应该基本上可以顾名思义了吧。
核心用法如下:
HANDLE hFind = FindFirstFile(szDir, &ffd);
// List all the files in the directory with some info about them.
do
{
if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
_tprintf(TEXT(" %s
}
else
{
filesize.LowPart = ffd.nFileSizeLow;
filesize.HighPart = ffd.nFileSizeHigh;
_tprintf(TEXT(" %s %ld bytes\n"), ffd.cFileName, filesize.QuadPart);
}
}
while (FindNextFile(hFind, &ffd) != 0);
FindClose(hFind);
优势在于不需要任何第三方库,可以获得其他更多文件的信息,譬如想知道文件的修改时间之类的,也可以在这上面扩展。
唯一的劣势,应该就是无法直接跨平台,但可以通过一式两份的方式跨,要更加高效。
如果想直接跨平台,即 Linux 与 Windows 下使用同一份代码,还可以考虑使用 Qt 框架。QDir可以以最清晰简单的代码解决上述问题:
// lists all the files in the current directory
#include
#include
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QDir dir;
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList list = dir.entryInfoList();
std::cout << " Bytes Filename" << std::endl;
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10).arg(fileInfo.fileName()));
std::cout << std::endl;
}
return 0;
}