2015-08-26 1 views
0

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

Однако это также захватывает любые скрытые файлы, которые находятся в папке. Я попытался просто удалить программу из файлов, начинающихся с «.», Но это не сработало в той папке, которую я тестировал (я все еще получаю «..», указанный в виде файла).

Вот часть кода:

while (handle != INVALID_HANDLE_VALUE) 
{ 
    filenameList.push_back(search_data.cFileName); 

    if (FindNextFile(handle, &search_data) == FALSE) 
     break; 
} 

    //removes a lot of hidden files from the file list 
    for (int i = 0; i < filenameList.size(); i++) 
    { 
     string hiddenCheck = filenameList[i]; 

     if (hiddenCheck[0] == '.') 
     { 
      filenameList.erase(filenameList.begin() + i); 
      i = 0; 
     } 
+0

Вы пробовали отладки кода , i. е. проверить, не работает ли обнаружение или стирание? –

+0

'Я все еще получаю" .. ", указанный как файл' Это не скрытый файл, и это ожидаемое поведение. Просто отфильтруйте «..» самостоятельно (а также «.») (Нет, я ничего не знаю, начиная с точки, но только с самой точкой) – deviantfan

+0

Скрытые файлы, о которых я говорю, начинаются с '.', например ".thumbs", ".dsstore" или ".bridge". Я пробовал различные способы поиска точки в начале имени файла, например, используя переменную char для поиска вместо строки, но никто не удалит все скрытые файлы. – penguin

ответ

3

Вы должны смотреть на атрибуты файлов, пока вы перечисляете файлы:

HANDLE handle = FindFirstFile(..., &search_data); 
if (handle != NULL) 
{ 
    do 
    { 
     // if not a directory, and not hidden... 
     if ((search_data.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_HIDDEN)) == 0) 
     { 
      // add it to the list... 
      filenameList.push_back(search_data.cFileName); 
     } 
    } 
    while (FindNextFile(handle, &search_data)); 
    FindClose(handle); 
} 
+0

Fyi для OP, это исключает * все * имена папок (т. Е. Вложенные папки), а не только те, которые начинаются с '.. '. Если вы хотите сохранить папки subdir, исключая только псевдонимы для '.' и' ..', это все равно нужно будет настроить. – WhozCraig

+0

@WhozCraig: Я не думаю, что OP должен беспокоиться об этом, учитывая, что исходный код даже не обрабатывал подпапки для начала. Описание OP говорит, что он хотел только имена файлов и ничего не о том, чтобы возвращаться в подпапки. –

+0

Не уверен, что вы подразумеваете, не обрабатывая подпапки. Из взглядов этого 'push_back', * все *, возвращаемое из цикла FindFirst/FindNext, было загружено в контейнер, включая имена субдиров. Если бы я предположил, что это не будет * рекурсивно * во вложенные папки, это не было моим намерением. Я просто заявлял * немедленные * имена папок поддиректора просто не включаются в список. Это все. Извините, если это не ясно. – WhozCraig

Смежные вопросы