2013-01-05 45 views
-2

您好,我在C++編程中很糟糕,我有這個項目要做。因此,程序必須搜索整個硬盤驅動器中的MP3文件,並將其名稱,路徑和ID標籤寫入文本文件並製作爲Windows平臺。整個不使用數組。任何人都可以幫我一下嗎?C++掃描MP3文件的硬盤並將它們寫入文本文件

+0

不使用數組?你可能想看看[這個庫](http://id3lib.sourceforge.net/)。 – BoBTFish

+7

僱用一名程序員。 –

+0

究竟是如何解決它?什麼平臺(Windows,Linux,Mac OS或...)?你如何找到身份證標籤(我真的不知道 - 我可能可以谷歌,但你也可以!)? –

回答

7

這是非常直接的,首先你需要迭代遍歷所有的文件/文件夾,用你感興趣的擴展名(在這裏是.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,或者只是想一個跨平臺的解決方案,你將不得不更改代碼。

+0

感謝您的回答,這是很好的幫助,雖然我有一些代碼的麻煩,有4個錯誤其中3是轉換錯誤在std ::字符串和一個是filter.c_str()不兼容type..could你協助請多一點? 錯誤C2664:'FindFirstFileW' 錯誤C2440:'':無法從'WCHAR [260]'轉換爲'std :: string' – user1950755

+0

您的項目似乎設置爲UNICODE ,你必須改變它,你正在使用IDE? – AngelCastillo

+0

哦,我想如果更改UNICODE會有所幫助,我使用VS2010,現在它的作品非常感謝你!如果我遇到麻煩,有沒有其他方式與您聯繫?還是非常感謝你 – user1950755

相關問題