c++扫描硬盘中的MP3文件,并将其写入文本文件
C++ scanning hard drive for MP3 files and write them into text file
你好,我在c++编程方面很糟糕,我有这个项目要做。因此,程序必须在整个硬盘中搜索MP3文件,并将其名称,路径和ID标签写入文本文件,并为Windows平台制作。不使用数组的整。有人能帮帮我吗?
这是非常直接的,首先您需要递归地遍历所有文件/文件夹,过滤您感兴趣的扩展名(在本例中为.mp3文件),然后读取元数据以获得ID标记。
你可以这样做:
遍历文件和文件夹:
c++没有提供这样做的标准方法,所以你必须寻找不同的可能的解决方案。
如果你正在使用Windows,你可以使用Win32 API:
- FindFirstFile
- FindNextFile
- FindClose
如果你是在Unix/Linux:
- opendir
- readdir
- closedir
如果你想要一个跨平台的解决方案,你可以看看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音频文件中的数据容器规定格式。此数据通常包含艺术家名称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上工作,或者只是想要一个跨平台的解决方案,你将不得不改变代码。
相关文章:
- 文本文件中的单词链表
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 如何将内容数组写入文本文件?
- 无法通过空白将文本文件行分隔为矢量
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- C++将文本文件中的数据读取到结构数组中
- 在指针的帮助下,文本文件中单词的频率
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 将值从二维数组输出到文本文件
- 如何使用 c++ 实现并发文件/文本编辑?
- 我需要转换一些代码,以便它适用于输入和输出文件文本
- 通过套接字发送二进制文件.文本文件有效,其他文件无效
- 将大型数据文件拆分为多个小文件(文本格式)
- 如何读取输入文件(文本文件)并将输入验证为有效整数
- 从文本文件/文本流中读取Q字符串错误
- 从文本文件(文本解析器)C++中读取行和列的逻辑
- 如何将*.css文件(文本文件)的内容与附加信息存储在新文件中?
- 关于内存映射文件和使用大文件文本编辑器
- 如何在读取文件文本时跳过"n"
- 使用libzip从.zip获取文件(文本除外)