Лекция №8. Если поиск завершился успешно, функция FindFirstFile возвращает идентификатор поиска, который будет затем использован в цикле при вызове функции FindNextFile

ПМСО

Если поиск завершился успешно, функция FindFirstFile возвращает идентификатор поиска, который будет затем использован в цикле при вызове функции FindNextFile. При ошибке возвращается значение INVALID_HANDLE_VALUE.

DwFileAttributes

Указывает атрибуты найденного файла. Этот элемент может быть комбинацией следующих значений:

Атрибут Описание
FILE_ATTRIBUTE_ARCHIVE Это архивный файл. Приложения должны использовать этот флаг для копирования, архивирования или удаления.
FILE_ATTRIBUTE_COMPRESSED Файл или каталог сжат. Для файла это означает, что все данные его сжаты, для каталога - что компрессия по умолчанию применяется ко всем его файлам и подкаталогам.
FILE_ATTRIBUTE_DIRECTORY Это каталог.
FILE_ATTRIBUTE_ENCRYPTED Файл или каталог зашифрован. Для файла, это означает, что все данные в файле зашифрованы. Для директории это означает, что шифрование является умолчанием для вновь созданных файлов и подкаталогов.
FILE_ATTRIBUTE_HIDDEN Файл скрыт. Такой файл не включается в обычный листинг каталога.
FILE_ATTRIBUTE_NORMAL У этого файла не установлены другие атрибуты. Это значение корректно только при использовании без остальных флагов.
FILE_ATTRIBUTE_OFFLINE Данные файла не доступны непосредственно. Означает, что реальные данные файла были физически перемещены на устройства хранения.
FILE_ATTRIBUTE_READONLY Файл только для чтения. Приложения могут читать такой файл, но не могут записывать или удалять его.
FILE_ATTRIBUTE_REPARSE_POINT Каталог является точкой повторной обработки.
FILE_ATTRIBUTE_SPARSE_FILE Файл является т.н. Разрежённый файл.
FILE_ATTRIBUTE_SYSTEM Этот файл - часть операционной системы.
FILE_ATTRIBUTE_TEMPORARY Это временный файл. Приложения должны записывать в такой файл только в крайней необходимости. Большая часть данных файла находится в памяти и не сбрасывается на диск, так как файл будет удалён.
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED Этот файл или каталог не будут индексироваться службой индексирования.
FILE_ATTRIBUTE_VIRTUAL Этот файл - виртуальный файл.

Поля cFileName и cAlternateFileName структуры WIN32_FIND_DATA содержат, соответственно, длинное имя файла и короткое, альтернативное имя файла “в формате 8.3”.


2) После вызова функции FindFirstFile необходимо выполнять в цикле вызов функции FindNextFile:

BOOL FindNextFile(HANDLE hFindFile, // идентификатор поиска LPWIN32_FIND_DATA lpFindFileData); // адрес структуры // WIN32_FIND_DATA

Через параметр hFindFile этой функции следует передать идентификатор поиска, полученный от функции FindFirstFile. Через параметр lpFindFileData необходимо передать адрес той же структуры типа WIN32_FIND_DATA, что была использована при вызове функции FindFirstFile.

Если функция FindNextFile завершилась успешно, она возвращает значение TRUE. При ошибке возвращается значение FALSE. Код ошибки можно получить с помощью функции GetLastError. В том случае, когда были просмотрены все файлы в каталоге, эта функция возвращает значение ERROR_NO_MORE_FILES. Данную ситуацию необходимо использовать для завершения цикла просмотра содержимого каталога.

3) После завершения цикла просмотра необходимо закрыть идентификатор поиска, вызвав для этого функцию FindClose:

BOOL FindClose(HANDLE hFindFile);

В качестве единственного параметра этой функции передается идентификатор поиска, полученный от функции FindFirstFile.

Сообщение: CB_GetLBText

Копиpует элемент из списка ComboBox в имеющийся буфеp.


Приложение COMBOBOX создает простейший одноколоночный список в диалоговой панели. В этот список добавляются названия файлов и папок диска D:\\. Можно выделить строку с именем файла или папки при помощи мыши. Выбранная строка будет выведена на экран функцией MessageBox.

______________________________________________________

#define STRICT

#include <tchar.h>

#include <windows.h>

#include <stdio.h>

#include <string>

using namespace std;

#include "resource.h"

#define IDB_Button1 1

// Прототипы функций

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);

// Имя класса окна

TCHAR const szClassName[] = _T("DialogAppClass");

// Заголовок окна

TCHAR const szWindowTitle[] = _T("Dialog Box Demo");

char Buffer[80];

HINSTANCE hInst;

HWND hComboBox;

// =====================================

// Функция WinMain

// =====================================

int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpszCmdLine, int nCmdShow)

{

MSG msg; // структура для работы с сообщениями

HWND hwnd; // идентификатор главного окна приложения

HWND hButton1;

WNDCLASS wc;

wc.style=CS_HREDRAW|CS_VREDRAW;

wc.cbClsExtra=wc.cbWndExtra=0;

wc.lpfnWndProc=WndProc;

wc.hInstance=hInstance;

wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);

wc.hCursor=LoadCursor(NULL,IDC_ARROW);

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

wc.lpszMenuName=(LPCTSTR)NULL;

wc.lpszClassName=szClassName;

if (!RegisterClass(&wc))

{

MessageBox(NULL,_T("Не могу зарегестрировать класс"),_T("Error"),MB_OK);

return 0;

}

hwnd=CreateWindow(szClassName,_T("Dilog"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL, hInstance,NULL);

if (!hwnd)

{

MessageBox(NULL,_T("Не могу создать окно"),_T("Error"),MB_OK);

return 0;

}

ShowWindow(hwnd,nCmdShow);

UpdateWindow(hwnd);

// Создаем кнопку

hButton1 = CreateWindow(_T("button"), _T("Open..."), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 90, 30, hwnd, (HMENU)IDB_Button1, hInstance, NULL);

// Запускаем цикл обработки сообщений

while(GetMessage(&msg, 0, 0, 0))

{ DispatchMessage(&msg); }

return msg.wParam;

}

// =====================================

// Функция WndProc

// =====================================

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

static DLGPROC lpfnDlgProc;

switch (msg)

{

case WM_COMMAND:

{

// Если нажата кнопка, выводим диалоговую панель

if(wParam == IDB_Button1)

{

lpfnDlgProc=(DLGPROC)MakeProcInstance((FARPROC)DlgProc,hInst);

DialogBox(hInst, MAKEINTRESOURCE(IDD_SELECT_FILE), hwnd, lpfnDlgProc);

}

return 0;

}

case WM_DESTROY:

{

PostQuitMessage(0);

return 0;

}

}

return DefWindowProc(hwnd, msg, wParam, lParam);

}

// =====================================

// Функция DlgProc

// =====================================

BOOL CALLBACK DlgProc(HWND hdlg, UINT msg, WPARAM wParam, LPARAM lParam)

{

WIN32_FIND_DATA* fd=new WIN32_FIND_DATA;

HANDLE H=FindFirstFile(_T("D:\\*"),fd);

bool b=true;

int uSelectedItem;

switch(msg)

{

case WM_INITDIALOG:

{

hComboBox = CreateWindow(_T("combobox"), NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD | LBS_WANTKEYBOARDINPUT, 30, 40, 250, 100, hdlg, (HMENU) IDC_COMBO, hInst, NULL);

SendMessage(hComboBox, WM_SETREDRAW, FALSE, 0);

while(b)

{

b=FindNextFile(H,fd);

SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)(LPSTR)(fd->cFileName));

}

FindClose(H);

delete fd;

SendMessage(hComboBox, WM_SETREDRAW, TRUE, 0);

return TRUE;

}

case WM_COMMAND:

{

switch(wParam)

{

case IDOK:

{

uSelectedItem = (int)SendMessage(hComboBox, CB_GETCURSEL, 0, 0);

if(uSelectedItem!= CB_ERR)

{

SendMessage(hComboBox,CB_GETLBTEXT,uSelectedItem,(LPARAM)Buffer);

MessageBox(hdlg,(LPCWSTR)Buffer,_T(" "), 0);

return TRUE;

}

}

case IDCANCEL:

{

EndDialog(hdlg, 0);

return TRUE;

}

}

}

}

return FALSE;

}

Самостоятельно на практике_3: разработать Windows-приложение, которое имело-бы одно главное окно со списком ComboBox и кнопкой button. В этот список необходимо вывести содержимое диска D:\\. При выборе строки в списке и при нажатии на кнопку button необходимо в окне MessageBox отобразить содержимое выделенной строки в списке.




double arrow
Сейчас читают про: