Как рекурсивно пересечь каталоги в C в Windows

В конечном счете я хочу путешествовать через файлы и подкаталоги папки и записать что-то во все файлы, я нахожу, что имеют определенное расширение (.wav в моем случае). когда цикличное выполнение, как я говорю, ли объект я в, является каталогом?

6
задан Brian Campbell 10 January 2010 в 22:44
поделиться

4 ответа

Одним из возможных решений проблемы является копирование отсутствующего кода из проекта Mono. В дне я делал небольшой проект с компактной структурой, и в нем отсутствовало все пространство имен System.XLM. Я просто скопировал всю вещь из Моно в свой проект, составил его и он здорово сработал с минимальными изменениями, iirc.

-121--4716728-

Как можно разбить документ на строки в эффективном способе (например, не закольцовывать безумно каждый символ в документе)?

Как, по-вашему, работает встроенный Split ?

Просто повторно примените его в качестве метода расширения.

-121--4126681-

Основываясь на вашем упоминании .wav , я предполагаю, что вы пишете код для Windows (это, кажется, место, где * .wav файлы наиболее распространены). В этом случае для обхода каталогов используются FindFirstFile и FindNextFile . Они используют структуру WIN32 _ FIND _ DATA , которая имеет элемент dwFileAttributes , содержащий флаги, указывающие атрибуты файла. Если значение dwAttributes & FILE_ATTRIBUTE_DIRECTORY не равно нулю, имеется имя каталога.

3
ответ дан 9 December 2019 в 22:35
поделиться

Размышление о микрооптимизации почти в любом случае является пустой тратой времени и приводит к неправильному мышлению...

-121--2364679-

Это может быть глупым вопросом, но почему вас беспокоит микроуправление качеством документа? Я считаю, что если вы используете ImageMagick для преобразования, он будет управлять качеством JPEG для вас для наилучшего эффекта. http://www.php.net/manual/en/intro.imagick.php

-121--942038-

Вот как вы это делаете (это все из памяти, так что могут быть ошибки):

void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
{
    TCHAR szFullPattern[MAX_PATH];
    WIN32_FIND_DATA FindFileData;
    HANDLE hFindFile;
    // first we are going to process any subdirectories
    PathCombine(szFullPattern, lpFolder, _T("*"));
    hFindFile = FindFirstFile(szFullPattern, &FindFileData);
    if(hFindFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                // found a subdirectory; recurse into it
                PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
                FindFilesRecursively(szFullPattern, lpFilePattern);
            }
        } while(FindNextFile(hFindFile, &FindFileData));
        FindClose(hFindFile);
    }

    // Now we are going to look for the matching files
    PathCombine(szFullPattern, lpFolder, lpFilePattern);
    hFindFile = FindFirstFile(szFullPattern, &FindFileData);
    if(hFindFile != INVALID_HANDLE_VALUE)
    {
        do
        {
            if(!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
            {
                // found a file; do something with it
                PathCombine(szFullPattern, lpFolder, FindFileData.cFileName);
                _tprintf_s(_T("%s\n"), szFullPattern);
            }
        } while(FindNextFile(hFindFile, &FindFileData));
        FindClose(hFindFile);
    }
}

Поэтому вы можете вызвать это как

FindFilesRecursively(_T("C:\\WINDOWS"), _T("*.wav"));

, чтобы найти все файлы * .wav в C :\WINDOWS и его подкаталогах.

Технически вам не нужно делать два вызова FindFirstFile (), но я нахожу, что функции сопоставления образцов, предоставляемые корпорацией Майкрософт (то есть StartMatchFileSpec или что-либо подобное), не так способны, как FindFirstFile (). Хотя для «* .wav» это, вероятно, будет хорошо.

7
ответ дан 9 December 2019 в 22:35
поделиться

opendir и readdir (на Unix), вот пример:

http://opengroup.org/onlinepubs/007908775/xsh/readdir.html

или FindFirstFile на окнах

вы могли также использовать оболочку довольно легко:

find . -name "*.wav"

or

ls **/*.wav    (in zsh and newer bashes)
0
ответ дан 9 December 2019 в 22:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: