-3

こんにちは、私は C++ プログラミングがかなり苦手で、このプロジェクトを行う必要があります。そのため、プログラムはハード ドライブ全体から MP3 ファイルを検索し、それらの名前、パス、および ID タグをテキスト ファイルに書き込み、Windows プラットフォーム用に作成する必要があります。配列を使用せずに全体。誰かが私を少し助けることができますか?

4

1 に答える 1

10

これは非常に簡単です。まず、すべてのファイル/フォルダーを再帰的に反復処理し、関心のある拡張子 (この場合は .mp3 ファイル) を持つものをフィルター処理してから、メタデータを読み取って ID タグを取得する必要があります。

これはあなたがそれを行う方法です:

ファイルとフォルダーを反復処理します。

C++ はこれを行うための標準的な方法を提供していないため、利用可能なさまざまな解決策を調べる必要があります。

Windowsを使用している場合は、Win32 API を使用できます。

  • FindFirstFile
  • 次のファイルを検索
  • 検索閉じる

Unix/Linuxで作業している場合:

  • opendir
  • readdir
  • 閉じる

また、クロスプラットフォーム ソリューションが必要な場合は、ブースト ファイルシステム モジュールを調べることができます。

以前の関数とメソッドを使用して、インターネット経由で利用できる実装がいくつかあります。

ファイルのフィルタリング:

一般的なアプローチは、「.」を使用してファイル パスの文字列を分割することです。(ドット) 文字をセパレーターとして使用し、最後の要素を取得します (ファイルにドットがないために分割が成功しない場合を考慮する必要があります)。

例 (未テスト):

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 を使用している場合やクロス プラットフォーム ソリューションが必要な場合は、コードを変更する必要があります。

于 2013-01-05T10:52:35.353 に答える