C ++扫描硬盘驱动器的MP3文件,并将其写入文本文件

时间:2013-01-05 09:48:41

标签: c++ search mp3

您好,我在C ++编程方面非常糟糕,我有这个项目要做。因此程序必须在整个硬盘中搜索MP3文件,并将其名称,路径和ID标签写入文本文件并为Windows平台制作​​。整个不使用数组。任何人都可以帮我一点吗?

1 个答案:

答案 0 :(得分:8)

这很简单,首先你需要递归迭代所有文件/文件夹,过滤那些你感兴趣的扩展名(在这种情况下是.mp3文件),然后读取元数据得到ID标签。

这是你可以做到的:

迭代文件和文件夹:

C ++没有提供这样做的标准方法,因此您必须研究可用的不同解决方案。

如果您使用的是 Windows ,则可以使用Win32 API:

  • FindFirstFile
  • FindNextFile
  • FindClose

如果您在 Unix / Linux

工作
  • 执行opendir
  • READDIR
  • closedir

如果您需要跨平台解决方案,可以查看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标签是存储在a中的MP3音频文件中的数据容器   规定的格式。此数据通常包含艺术家姓名Song   当前音频文件的标题,年份和流派。

示例:

这是上面解释的一些概念的工作实现,该程序递归地遍历所有文件和文件夹,并在屏幕上打印具有.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或只是想要跨平台解决方案,则必须更改代码。