遍历目录下所有wav并播放

本文介绍了一个使用C++编写的程序,该程序能够在指定路径下查找所有.wav格式的音频文件,并逐一播放它们。通过递归地搜索指定目录及其子目录,此程序能够定位并播放所有符合要求的音频文件。
#include "windows.h"
#include <wchar.h>
#include <locale.h>
#include "mmsystem.h"

#pragma comment(lib,"winmm.lib")

int find_all_files(wchar_t* lpPath)
{
    setlocale(LC_ALL, "chs");
    WIN32_FIND_DATA FindFileData;
    wchar_t wcPath[MAX_PATH];
    wcscpy_s(wcPath, lpPath);
    wcscat_s(wcPath, L"\\*.*");
    HANDLE hFind = ::FindFirstFile(wcPath, &FindFileData);
    if (INVALID_HANDLE_VALUE == hFind)
        return -1;

    do
    {
        if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0)
            {
                //发现子目录,递归之
                wchar_t szFile[MAX_PATH];
                wcscpy_s(szFile, lpPath);
                wcscat_s(szFile, L"\\");
                wcscat_s(szFile, FindFileData.cFileName);
                find_all_files(szFile);
            }
        }
        else
        {
            if (wcswcs(FindFileData.cFileName, L".wav") != 0) {
                wchar_t szFile[MAX_PATH];
                wcscpy_s(szFile, lpPath);
                wcscat_s(szFile, L"\\");
                wcscat_s(szFile, FindFileData.cFileName);
                wprintf(L"%s\n", szFile);
                sndPlaySound(szFile, SND_SYNC);
            }
        }
    } while (::FindNextFile(hFind, &FindFileData));

    ::FindClose(hFind);

    return 0;
}

int main(int argc, char* argv[])
{
    find_all_files(L"C:\\Windows\\Media");
    system("pause");
    return 0;
}
<think>我们正在使用C++遍历指定文件夹中的所有.wav文件。在C++17之前,我们需要使用操作系统特定的API(如Windows的FindFirstFile/FindNextFile或POSIX的opendir/readdir)或第三方库(如Boost)。但从C++17开始,标准库引入了<filesystem>头文件,使得文件系统操作变得简单且跨平台。 我们将使用std::filesystem来遍历目录。基本步骤如下: 1. 包含头文件:<filesystem>和<iostream> 2. 使用namespace std::filesystem来简化代码(或者使用别名) 3. 使用directory_iterator或recursive_directory_iterator遍历目录 4. 检查每个文件的扩展名是否为.wav(注意大小写问题) 注意:由于文件扩展名可能大小写混合,我们通常将扩展名转换为小写进行比较。 下面是一个示例代码:</think>### C++遍历指定目录下的.wav文件 在C++遍历目录筛选特定扩展名的文件,推荐使用C++17引入的`<filesystem>`库(跨平台)或平台特定API。以下是两种实现方案: #### 方案1:使用C++17标准库(跨平台) ```cpp #include <iostream> #include <filesystem> #include <vector> namespace fs = std::filesystem; std::vector<fs::path> find_wav_files(const std::string& dir_path) { std::vector<fs::path> wav_files; try { for (const auto& entry : fs::directory_iterator(dir_path)) { if (entry.is_regular_file() && entry.path().extension() == ".wav") { wav_files.push_back(entry.path()); } } } catch (const fs::filesystem_error& e) { std::cerr << "文件系统错误: " << e.what() << std::endl; } return wav_files; } int main() { std::string target_dir = "/path/to/your/directory"; // 替换为实际路径 auto wav_list = find_wav_files(target_dir); std::cout << "找到 " << wav_list.size() << " 个WAV文件:\n"; for (const auto& path : wav_list) { std::cout << "• " << path.filename() << "\n"; } return 0; } ``` #### 方案2:Windows平台API(兼容旧编译器) ```cpp #include <iostream> #include <windows.h> #include <vector> #include <string> std::vector<std::string> find_wav_files_win(const std::string& dir) { std::vector<std::string> wav_files; WIN32_FIND_DATAA find_data; HANDLE hFind = FindFirstFileA((dir + "\\*.wav").c_str(), &find_data); if (hFind == INVALID_HANDLE_VALUE) { std::cerr << "目录未找到: " << dir << std::endl; return wav_files; } do { if (!(find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { wav_files.push_back(dir + "\\" + find_data.cFileName); } } while (FindNextFileA(hFind, &find_data)); FindClose(hFind); return wav_files; } // main函数与方案1类似 ``` ### 关键说明 1. **扩展名处理**:`.wav`扩展名严格区分大小写,如需不敏感比较可添加: ```cpp std::string ext = entry.path().extension().string(); std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); ``` 2. **递归遍历**:使用`recursive_directory_iterator`可搜索子目录 3. **错误处理**:需检查目录是否存在(`fs::exists(dir_path)`) 4. **路径格式**:Windows路径建议使用`R"(C:\audio\)"`原始字符串 > 示例输出: > ``` > 找到 3 个WAV文件: > • sample1.wav > • test_audio.wav > • output.wav > ``` ### 性能优化建议 - 大型目录使用`directory_iterator`而非`recursive_directory_iterator` - 内存受限时改用回调模式而非返回vector - 行处理:C++17支持`std::execution::par`遍历
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值