FindFirstFile FindNextFile возвращают не все файлы
От: Аноним  
Дата: 31.08.05 18:04
Оценка:
Поиск файлов идет в каталоге c:\windows\system32
возвращаются только 3 объекта
drivers,
folder.htt
и desktop.ini
Re: FindFirstFile FindNextFile возвращают не все файлы
От: To4kuH  
Дата: 31.08.05 18:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Поиск файлов идет в каталоге c:\windows\system32

А>возвращаются только 3 объекта
А>drivers,
А>folder.htt
А>и desktop.ini


Один раз тоже столкнулся с такой ерундой. нужно было получить список директорий... в хелпе было указано что для директории свойство SearchRec.Attr (var SearchRec: TSearchRec равно faDirectory (это константа, равная не помню чему (32 чтоли)). только оказалось что еще может быть равно и 48 .
вот код :

procedure ScanDir(StartDir: string; List: TStrings);
var
SearchRec: TSearchRec;
begin
if StartDir[Length(StartDir)] <> '\' then
StartDir := StartDir + '\';
if FindFirst(StartDir+'*.*', faDirectory, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if ((SearchRec.Attr = faDirectory) or (SearchRec.Attr = 48)) then
if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
List.Add(SearchRec.Name);
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
Re[2]: FindFirstFile FindNextFile возвращают не все файлы
От: To4kuH  
Дата: 31.08.05 18:30
Оценка:
определил, кстати, простым способом. вывел значеня этого поля для всех файлов и папок директории
Re[3]: FindFirstFile FindNextFile возвращают не все файлы
От: Аноним  
Дата: 31.08.05 18:50
Оценка:
Здравствуйте, To4kuH, Вы писали:

TH>определил, кстати, простым способом. вывел значеня этого поля для всех файлов и папок директории


А, если применительно к C++?
Вот мой код:

void CFmanagerView::UpdateRightPanel(void)
{
    //объявление переменных
    CListCtrl& RightList = GetListCtrl();
    HANDLE hFindFile;    //handle used in a subsequent call
    //    to FindNextFile or FindClose.
    WIN32_FIND_DATA lpFindFileData;     char maskofext[] = "*.*";
    char strFullPath[MAX_PATH]; //строка, которая хранит полный путь + маска
    char strTempPath[MAX_PATH]; //строка, которая хранит полный путь 
    int iList = 0;
    SHFILEINFO info;
    DWORD dwRet;
    HIMAGELIST hImgList;
    DWORD laster;
    RightList.DeleteAllItems();
    strcpy(strFullPath, strCurrentRightDir);
    if (strFullPath[lstrlen(strFullPath)-1] != '\\') 
        strcat(strFullPath, "\\");
    strcat(strFullPath, maskofext);
    
    //////////////////////////////////////////////////////////////////////////
    hFindFile = FindFirstFile(
        strFullPath,                //путь для поиска
        &lpFindFileData);
    if (INVALID_HANDLE_VALUE != hFindFile  ) {    //если не ошибка, то открываем цикл
        do {
                //пропускаем точку
                if(strcmp(lpFindFileData.cFileName, "."))
                {
                    // Здесь получаем иконку из system imagelist
                        //Формируем полный путь для данного файла
                    strcpy(strTempPath, strCurrentRightDir);
                    if (strTempPath[lstrlen(strTempPath)-1] != '\\') 
                        strcat(strTempPath, "\\");
                    strcat(strTempPath, lpFindFileData.cFileName);
                    dwRet = SHGetFileInfo (strTempPath, FILE_ATTRIBUTE_NORMAL,
                        &info, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES
 | SYSICONINDEX | SHGFI_SMALLICON );
                    hImgList = reinterpret_cast<HIMAGELIST>( dwRet );
                    //присоединяем ее к нашему imagelist' у
                    ASSERT ( NULL != hImgList );
                    if ( NULL != m_imlSmallDrives.GetSafeHandle() )    //если уже присоединен 
                        //то удаляем его из imagelist'а
                    {
                        m_imlSmallDrives.Detach();
                    }
                    VERIFY ( m_imlSmallDrives.Attach ( hImgList ));
                    RightList.SetImageList(&m_imlSmallDrives, LVSIL_SMALL );    
                    ASSERT(RightList.GetImageList(LVSIL_SMALL) == &m_imlSmallDrives);//?
                    //////////////////////////////////////////////////////////////////////////
                    SHFILEINFO sfi;
                    SHGetFileInfo (strTempPath, 0, &sfi, sizeof(SHFILEINFO), SHGFI_ICON | SHGFI_DISPLAYNAME | SHGFI_SMALLICON);
                    RightList.InsertItem(iList, lpFindFileData.cFileName , sfi.iIcon);
                    iList++;
                }
            } while(FindNextFile(hFindFile, &lpFindFileData) != NULL);    
        FindClose(hFindFile);    }
}


Исправлено форматирование кода. 2Аноним — отбивайте код тэгами, имейте уважение к тем кто будет читать ваше сообщение
Re[4]: FindFirstFile FindNextFile возвращают не все файлы
От: To4kuH  
Дата: 31.08.05 18:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, To4kuH, Вы писали:


TH>>определил, кстати, простым способом. вывел значеня этого поля для всех файлов и папок директории



А>А, если применительно к C++?

......
А>}

мммм. к сожелению к с++ тока недавно приступил... ничего не могу подсказать.. пока не могу..
Re[2]: FindFirstFile FindNextFile возвращают не все файлы
От: gear nuke  
Дата: 01.09.05 05:07
Оценка: +1
Здравствуйте, To4kuH, Вы писали:

А>>Поиск файлов идет в каталоге c:\windows\system32

А>>возвращаются только 3 объекта
А>>drivers,
А>>folder.htt
А>>и desktop.ini

TH>Один раз тоже столкнулся с такой ерундой. нужно было получить список директорий... в хелпе было указано что для директории свойство SearchRec.Attr (var SearchRec: TSearchRec равно faDirectory (это константа, равная не помню чему (32 чтоли)). только оказалось что еще может быть равно и 48 .


Нет, не может. Это битовый флаг:
#define FILE_ATTRIBUTE_DIRECTORY            0x00000010  // winnt
#define FILE_ATTRIBUTE_ARCHIVE              0x00000020  // winnt

TH>      if ((SearchRec.Attr = faDirectory) or (SearchRec.Attr = 48)) then

Правильно:
if ( SearchRec.Attr & FILE_ATTRIBUTE_DIRECTORY )
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: FindFirstFile FindNextFile возвращают не все файлы
От: To4kuH  
Дата: 01.09.05 06:06
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, To4kuH, Вы писали:


А>>>Поиск файлов идет в каталоге c:\windows\system32

А>>>возвращаются только 3 объекта
А>>>drivers,
А>>>folder.htt
А>>>и desktop.ini

TH>>Один раз тоже столкнулся с такой ерундой. нужно было получить список директорий... в хелпе было указано что для директории свойство SearchRec.Attr (var SearchRec: TSearchRec равно faDirectory (это константа, равная не помню чему (32 чтоли)). только оказалось что еще может быть равно и 48 .


GN>Нет, не может. Это битовый флаг:

GN>
GN>#define FILE_ATTRIBUTE_DIRECTORY            0x00000010  // winnt
GN>#define FILE_ATTRIBUTE_ARCHIVE              0x00000020  // winnt
GN>



хм, но тем не менее... когда делал на работе, проверял на равенство только faDirectory. все пахало. и был очень удивлен, когда запустил эту прогу на домашней машине. увидел тока несколько директорий.
Constant    Value    Description    Linux Meaning
faDirectory    16    Directory files    Directory.


вывел все файлы вместе с атрибутами. и вот у некоторых директорий этот битовый флаг был равен 16, у других 48. в чем причина -- не разбирался
Re[4]: FindFirstFile FindNextFile возвращают не все файлы
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 01.09.05 06:28
Оценка:
Здравствуйте, To4kuH, Вы писали:

GN>>Нет, не может. Это битовый флаг:

GN>>
GN>>#define FILE_ATTRIBUTE_DIRECTORY            0x00000010  // winnt
GN>>#define FILE_ATTRIBUTE_ARCHIVE              0x00000020  // winnt
GN>>


TH>хм, но тем не менее... когда делал на работе, проверял на равенство только faDirectory. все пахало.


ну да, и C:\WINDOWS\Fonts отображалась, на которой стоит атрибут System?

TH>и был очень удивлен, когда запустил эту прогу на домашней машине. увидел тока несколько директорий.

TH>
TH>Constant    Value    Description    Linux Meaning
TH>faDirectory    16    Directory files    Directory.
TH>


TH>вывел все файлы вместе с атрибутами. и вот у некоторых директорий этот битовый флаг был равен 16, у других 48. в чем причина -- не разбирался


ясен пень в чем — кроме FILE_ATTRIBUTE_DIRECTORY установлен еще и флаг FILE_ATTRIBUTE_ARCHIVE Можно еще и FILE_ATTRIBUTE_SYSTEM и FILE_ATTRIBUTE_HIDDEN впендюрить в разных комбинациях, еще 10 разных чисел будет, так и будешь со всеми сравнивать?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: FindFirstFile FindNextFile возвращают не все файлы
От: gear nuke  
Дата: 01.09.05 06:36
Оценка:
Здравствуйте, To4kuH, Вы писали:

TH>>>Один раз тоже столкнулся с такой ерундой. нужно было получить список директорий... в хелпе было указано что для директории свойство SearchRec.Attr (var SearchRec: TSearchRec равно faDirectory (это константа, равная не помню чему (32 чтоли)). только оказалось что еще может быть равно и 48 .


GN>>Нет, не может. Это битовый флаг:

GN>>
GN>>#define FILE_ATTRIBUTE_DIRECTORY            0x00000010  // winnt
GN>>#define FILE_ATTRIBUTE_ARCHIVE              0x00000020  // winnt
GN>>

TH>хм, но тем не менее... когда делал на работе, проверял на равенство только faDirectory.

Это флаг, поэтому нужно проверять только один бит, а не весь DWORD. Иначе может работать, а может и не работать .
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: FindFirstFile FindNextFile возвращают не все файлы
От: gear nuke  
Дата: 01.09.05 06:36
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>А, если применительно к C++?

А>Вот мой код:

[nuked]

  1. Используйте теги форматирования кода ([pascаl][/pascal]), иначе читать невозможно.
  2. Старайтесь приводить только код относящийся к проблеме. Вполне вероятно, что исключая лишнее, Вы сами найдёте ошибку.
  3. Заглядывайте в MSDN, там можно найти примеры

Вот модифицированный пример из MSDN (Оригинал):
#include <windows.h>
#include <string.h>
#include <stdio.h>

void show_dir(WIN32_FIND_DATA * f)
{
    if ( f->cFileName[0] == '.' && f->cFileName[1] == '\0'
      || f->cFileName[0] == '.' && f->cFileName[1] == '.' && f->cFileName[2] == '\0'
      || ! (f->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
      )
      return; 

    printf ("%s\n", f->cFileName);   
}


int main(int argc, char *argv[])
{
    if ( argc != 2 )
    {
        printf("Usage: listdir directory.\n");
        return ~0;
    }

    size_t path_len = strlen(argv[1]);
    if ( path_len > MAX_PATH - sizeof("\\*") )
    {
        printf("Specified path is too long.\n");
        return ~0;
    }

    printf ("Target directory is %s.\n", argv[1]);

    char path[MAX_PATH];
    strcpy(path, argv[1]);
    path[path_len] = '\\';
    path[path_len+1] = '*';
    path[path_len+2] = '\0';

    WIN32_FIND_DATA FindFileData;
    HANDLE found = FindFirstFile(path, &FindFileData); 
    if ( INVALID_HANDLE_VALUE == found )
    {
        printf ("Invalid file handle. Error is %u\n", GetLastError());
        return ~0;
    }
    else 
    {
        show_dir(&FindFileData);
        while ( FindNextFile(found, &FindFileData) ) 
        {
            show_dir(&FindFileData);
        }
        FindClose(found);
        
        DWORD error = GetLastError();
        if ( error != ERROR_NO_MORE_FILES ) 
        {
            printf ("FindNextFile error. Error is %u\n", error);
            return ~0;
        }
    }
    return 0;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: FindFirstFile FindNextFile возвращают не все файлы
От: To4kuH  
Дата: 01.09.05 13:51
Оценка:
Здравствуйте, gear nuke, Вы писали:

.....

GN>Это флаг, поэтому нужно проверять только один бит, а не весь DWORD. Иначе может работать, а может и не работать .



угу. понял. посмотрел эти атрибуты в двоичном виде.. нужно внимательней rtfm
Re[5]: FindFirstFile FindNextFile возвращают не все файлы
От: Аноним  
Дата: 01.09.05 15:58
Оценка:
Может я чего-то не понимаю, но вопрос стоял в том, что функция FindNextFile возвращает не все файлы
Т.е попросту говорит, что файлов нет (делаю getlasterror) и именно в C:\windows\system32, хотя там есс-но файлов до черта...
Re[6]: FindFirstFile FindNextFile возвращают не все файлы
От: Danchik Украина  
Дата: 01.09.05 16:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Может я чего-то не понимаю, но вопрос стоял в том, что функция FindNextFile возвращает не все файлы

А>Т.е попросту говорит, что файлов нет (делаю getlasterror) и именно в C:\windows\system32, хотя там есс-но файлов до черта...

Люди попробовали потелепатировать на этот счет и причем пришли к правильным умозаключениям Тебе вернуло только hidden файлы!
В твоем случае вызывается главный виновник: код в студию!
Re[6]: FindFirstFile FindNextFile возвращают не все файлы
От: gear nuke  
Дата: 01.09.05 16:32
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Может я чего-то не понимаю, но вопрос стоял в том, что функция FindNextFile возвращает не все файлы

А>Т.е попросту говорит, что файлов нет (делаю getlasterror) и именно в C:\windows\system32, хотя там есс-но файлов до черта...

Мой пример тоже не выводит ничего? У меня он выводит список подпапок (сбили в другом посте размышлениями о FILE_ATTRIBUTE_DIRECTORY). Если нужны и файлы, нужно просто убрать проверку с этим флагом.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: FindFirstFile FindNextFile возвращают не все файлы
От: Аноним  
Дата: 01.09.05 16:34
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Люди попробовали потелепатировать на этот счет и причем пришли к правильным умозаключениям Тебе вернуло только hidden файлы!

D>В твоем случае вызывается главный виновник: код в студию!

Странно, но при просмотре других каталогов все нормально.
Вот мой код:

    HANDLE hFindFile;    //handle used in a subsequent call
    //    to FindNextFile or FindClose.
    WIN32_FIND_DATA lpFindFileData; 
    char maskofext[] = "*.*";
    char strFullPath[MAX_PATH]; //строка, которая хранит полный путь + маска
    strcpy(strFullPath, strCurrentRightDir);
    if (strFullPath[lstrlen(strFullPath)-1] != '\\') 
        strcat(strFullPath, "\\");
    strcat(strFullPath, maskofext);
    
    //////////////////////////////////////////////////////////////////////////
    hFindFile = FindFirstFile(
        strFullPath,                
        &lpFindFileData);
    if (INVALID_HANDLE_VALUE != hFindFile  ) {    
        do {
                //пропускаем точку
                if(strcmp(lpFindFileData.cFileName, "."))
                {
                                ...

                }
            } while(FindNextFile(hFindFile, &lpFindFileData) != NULL);            
        FindClose(hFindFile);    }
Re[7]: FindFirstFile FindNextFile возвращают не все файлы
От: Аноним  
Дата: 01.09.05 17:05
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Мой пример тоже не выводит ничего? У меня он выводит список подпапок (сбили в другом посте размышлениями о FILE_ATTRIBUTE_DIRECTORY). Если нужны и файлы, нужно просто убрать проверку с этим флагом.


Спасибо за ответ.

Ваш пример все выводит. Буду разбираться в своем коде...
Re[8]: FindFirstFile FindNextFile возвращают не все файлы
От: gear nuke  
Дата: 01.09.05 17:19
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, gear nuke, Вы писали:


GN>>Мой пример тоже не выводит ничего? У меня он выводит список подпапок (сбили в другом посте размышлениями о FILE_ATTRIBUTE_DIRECTORY). Если нужны и файлы, нужно просто убрать проверку с этим флагом.


А>Спасибо за ответ.


А>Ваш пример все выводит. Буду разбираться в своем коде...


Мне почему-то кажется, что если в Ваш код поставить printf, то он тоже будет всё выводить, а проблема в другом месте.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[9]: FindFirstFile FindNextFile возвращают не все файлы
От: Аноним  
Дата: 01.09.05 19:33
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Мне почему-то кажется, что если в Ваш код поставить printf, то он тоже будет всё выводить, а проблема в другом месте.


Да, действительно, перетащил цикл из mfc'ного проекта в win32 console application и заработало!!!

if (INVALID_HANDLE_VALUE != hFindFile  ) {
        do
        { ... }     
        while(FindNextFile(hFindFile, &lpFindFileData));


И там и там просто смотрел, что возвращают функции не выводя на экран результат. В mfc проекте не хочет искать ВСЕ файлы и папки и все тут.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.