【问题标题】:C++ scanning hard drive for MP3 files and write them into text file [closed]C ++扫描硬盘驱动器以查找MP3文件并将它们写入文本文件[关闭]
【发布时间】:2013-01-05 09:48:40
【问题描述】:

你好,我的 C++ 编程很差,我有这个项目要做。因此程序必须在整个硬盘驱动器中搜索 MP3 文件,并将它们的名称、路径和 ID 标签写入文本文件,并为 Windows 平台制作。整体不使用数组。谁能帮帮我?

【问题讨论】:

  • 不使用数组???你可能想看看this library
  • 聘请程序员。
  • 您对如何解决这个问题的具体想法是什么?什么平台(Windows、Linux、Mac OS 或...)?你如何找到 ID 标签(我真的不知道 - 我可能可以用谷歌搜索,但你也可以!)?
  • 对不起,我忘了!它适用于 Windows 平台,我检查了一些关于这些 ID 标签的信息,我一开始主要关心的是文件搜索

标签: c++ search mp3


【解决方案1】:

这很简单,首先您需要递归遍历所有文件/文件夹,过滤具有您感兴趣的扩展名的文件/文件夹(在本例中为 .mp3 文件),然后读取元数据以获取ID 标签。

你可以这样做:

遍历文件和文件夹:

C++ 不提供执行此操作的标准方法,因此您必须研究可供您使用的不同可能的解决方案。

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

  • 查找第一个文件
  • 查找下一个文件
  • 查找关闭

如果您在 Unix/Linux 中工作:

  • 打开目录
  • 读取目录
  • 关闭

如果您想要一个跨平台的解决方案,您可以查看 boost 文件系统模块。

使用前一种功能和方法可以通过 Internet 获得多种实现。

过滤文件:

一般的方法是使用“.”分割文件路径的字符串。 (点)字符作为分隔符并获取最后一个元素(您必须考虑由于文件没有点而导致拆分不成功的情况)。

示例(未测试):

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 或只是想要一个跨平台解决方案,您将不得不更改代码。

【讨论】:

  • 感谢您的回答,这是很大的帮助,虽然我对该代码有一些问题,但有 4 个错误,其中 3 个是 std::string 中的转换错误,一个是 filter.c_str() 不兼容类型..你能帮忙多一点吗?错误 C2664:“FindFirstFileW”错误 C2440:“”:无法从“WCHAR [260]”转换为“std::string”
  • 您的项目似乎设置为为 UNICODE 构建,您必须更改它,您使用的是什么 IDE?
  • 哦,太好了,我想如果更改 UNICODE 会有所帮助,我正在使用 VS2010,现在它可以工作了,非常感谢!如果我遇到问题,还有其他方式可以联系您吗?还是非常感谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2020-03-29
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
相关资源
最近更新 更多