你好,我在 C++ 编程方面很糟糕,我有这个项目要做。因此程序必须在整个硬盘驱动器中搜索 MP3 文件,并将它们的名称、路径和 ID 标签写入文本文件,并为 Windows 平台制作。整体不使用数组。谁能帮我一点忙?
问问题
2818 次
1 回答
10
这很简单,首先您需要递归遍历所有文件/文件夹,过滤具有您感兴趣的扩展名的文件/文件夹(在本例中为 .mp3 文件),然后读取元数据以获取 ID 标签。
您可以这样做:
遍历文件和文件夹:
C++ 没有提供执行此操作的标准方法,因此您必须研究可供您使用的不同可能的解决方案。
如果您使用的是Windows,则可以使用 Win32 API:
- 查找第一个文件
- 查找下一个文件
- 查找关闭
如果您在Unix/Linux中工作:
- 打开目录
- 读目录
- 关闭
如果你想要一个跨平台的解决方案,你可以查看 boost 文件系统模块。
互联网上有几种使用前一种功能和方法的实现。
过滤文件:
一般的方法是使用“。”分割文件路径的字符串。(点)字符作为分隔符并获取最后一个元素(您必须考虑由于文件没有点而导致拆分不成功的情况)。
示例(未测试):
bool fileHasExtension(const std::string& fileName, const std::string& extension)
{
if(fileName.find_last_of(".") != std::string::npos)
return extension.compare(fileName.substr(fileName.find_last_of(".") + 1)) == 0;
return false;
}
获取元数据:
你可以在这里阅读它http://id3.org/
ID3 标签是以规定格式存储的 MP3 音频文件中的数据容器。该数据通常包含当前音频文件的艺术家姓名、歌曲名称、年份和流派。
例子:
这是上面解释的一些概念的工作实现,该程序递归遍历所有文件和文件夹,并在屏幕上打印扩展名为 .mp3 的文件和文件夹(它不会获取 ID3 标签上的元数据信息)。
#include <windows.h>
#include <string>
#include <iostream>
void GetFileListing(std::string directory, std::string fileFilter, bool recursively = true)
{
if (recursively)
GetFileListing(directory, fileFilter, false);
directory += "\\";
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
std::string filter = directory + (recursively ? "*" : fileFilter);
hFind = FindFirstFile(filter.c_str(), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
return;
}
else
{
if (!recursively)
{
std::cout << directory + std::string(FindFileData.cFileName) << std::endl;
}
while (FindNextFile(hFind, &FindFileData) != 0)
{
if (!recursively)
{
std::cout << directory + std::string(FindFileData.cFileName) << std::endl;
}
else
{
if ((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)>0 && FindFileData.cFileName[0]!='.')
{
GetFileListing(directory + std::string(FindFileData.cFileName), fileFilter);
}
}
}
DWORD dwError = GetLastError();
FindClose(hFind);
if (dwError != ERROR_NO_MORE_FILES)
{
std::cout << "FindNextFile error. Error is "<< dwError << std::endl;
}
}
}
int main(int argc, char* argv[])
{
GetFileListing("C:\\", "*.mp3");
}
它使用 Windows API,因此如果您使用 Linux 或只是想要一个跨平台解决方案,您将不得不更改代码。
于 2013-01-05T10:52:35.353 回答