您好,我在C++編程中很糟糕,我有這個項目要做。因此,程序必須搜索整個硬盤驅動器中的MP3文件,並將其名稱,路徑和ID標籤寫入文本文件並製作爲Windows平臺。整個不使用數組。任何人都可以幫我一下嗎?C++掃描MP3文件的硬盤並將它們寫入文本文件
回答
這是非常直接的,首先你需要迭代遍歷所有的文件/文件夾,用你感興趣的擴展名(在這裏是.mp3文件)過濾,然後讀取元數據以獲得ID標籤。
這是你如何能做到這一點:
遍歷文件和文件夾:
C++沒有提供這樣的一種標準的方式,所以你必須考慮不同的可能可用的解決方案。
如果您正在使用工作的Windows,您可以使用Win32 API:
- 用FindFirstFile
- FindNextFile
- FindClose
如果您在的Unix/Linux的工作:
- 執行opendir
- READDIR
- closedir
如果你想要一個跨平臺的解決方案,您可以考慮提高文件系統模塊。
在互聯網上有幾種使用前面的功能和方法的實現。
過濾文件:
一般的做法是分割文件的路徑使用字符串「」 (點)字符作爲分隔符並獲取最後一個元素(您將必須考慮由於文件沒有點而導致分割不成功的情況)。
例(未測試):
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 ::字符串和一個是filter.c_str()不兼容type..could你協助請多一點? 錯誤C2664:'FindFirstFileW' 錯誤C2440:'
您的項目似乎設置爲UNICODE ,你必須改變它,你正在使用IDE? – AngelCastillo
哦,我想如果更改UNICODE會有所幫助,我使用VS2010,現在它的作品非常感謝你!如果我遇到麻煩,有沒有其他方式與您聯繫?還是非常感謝你 – user1950755
- 1. 將文本讀取並寫入硬盤上的單獨文件
- 2. C#文件 - 從桌面讀取文件並將它們寫入特定文件
- 3. 讀取UTF-8文本行並將它們寫入文件
- 4. 檢測文件中的更改並將它們寫入文件
- 5. 掃描儀文本文件
- 6. Java掃描文本文件
- 7. 掃描文本文件
- 8. 掃描文本文件導入對象
- 9. 使用bat文件掃描新硬件?
- 10. 掃描php文件的目錄,並將它們包含在當前腳本中
- 11. C++,文件I/O ...我有一個.txt文件,我必須從它掃描外顯子和內含子,並將它們寫入單獨的文件
- 12. C#使用ThreadPool將文件寫入硬盤的線程
- 13. Java - 讀取鍵盤輸入並將其寫入文本文件
- 14. 如何掃描字符串並將其寫入文件?
- 15. 使用掃描器類寫入文本文件內部類
- 16. 使用Android掃描硬盤中的文件
- 17. 要包含在Android中掃描.mp3文件的文件夾
- 18. 僅保留一個文本文件中的特定字符並將它們寫入新的文本文件
- 19. 逐行讀取文本文件並從緩衝區掃描 - C
- 20. 從文件中掃描C
- 21. TeamCity的:掃描所有文件文本
- 22. C++多次將文本寫入文件
- 23. 連接文本文件並將它們導入SQLite數據庫
- 24. C#SteamWriter:如何創建多個文本文件並寫入它們?
- 25. 將文本寫入文件
- 26. Python:從文本文件splitlines(),然後將它們寫回文本文件
- 27. 選擇cvs文件中的行並將它們寫入另一個csv文件
- 28. 從文本文件中掃描
- 29. 掃描儀僅讀取文本文件
- 30. 使用Java掃描文本文件
不使用數組?你可能想看看[這個庫](http://id3lib.sourceforge.net/)。 – BoBTFish
僱用一名程序員。 –
究竟是如何解決它?什麼平臺(Windows,Linux,Mac OS或...)?你如何找到身份證標籤(我真的不知道 - 我可能可以谷歌,但你也可以!)? –