- •Дополнительная информация из интернета
- •Открытие файлов
- •Стандартные диалоговые панели для открытия файлов
- •NMaxCustFilter - Определяет размер буфера в байтах, указанного в поле lpstrCustomFilter. Размер этого буфера должен быть не меньше 40 байт.
- •Закрытие файлов
- •Создание файлов
- •Чтение и запись
- •Позиционирование
- •Определение типа устройства ввода/вывода
- •Использование стандартной библиотеки транслятора
Позиционирование
Для выполнения операции позиционирования внутри файла приложения Windows могут использовать функцию _llseek :
LONG WINAPI _llseek(
HFILE hf, // идентификатор файла
LONG lOffset, // смещение
int nOrigin); // способ использования смещения
Функция _llseek перемещает указатель текущей позиции в файле на lOffset байт, причем направление смещения зависит от значения параметра nOrigin следующим образом:
Значение |
Описание |
SEEK_SET |
Указатель текущей позиции в файле перемещается на lOffset байт от начала файла |
SEEK_CUR |
Указатель текущей позиции в файле перемещается на lOffset байт от текущей позиции |
SEEK_END |
Указатель текущей позиции в файле перемещается на lOffset байт от конца файла |
Таким образом, с помощью этой функции вы можете обеспечить прямой доступ к файлу.
Функция возвращает новое значение текущей позиции от начала файла или HFILE_ERROR при ошибке.
Определение типа устройства ввода/вывода
Иногда приложению требуется определить тип и расположение используемого дискового устройства ввода/вывода. Для этого можно воспользоваться функцией GetDriveType :
UINT WINAPI GetDriveType(int DriveNumber);
Параметр DriveNumber определяет номер диска, для которого требуется определить тип и расположение (0 соответствует устройству A:, 1 - B:, и т. д.).
Функция может вернуть 0 при ошибке или одно из следующих значений:
Значение |
Описание |
DRIVE_REMOVABLE |
Сменный диск |
DRIVE_FIXED |
Несменный диск |
DRIVE_REMOTE |
Удаленный диск, расположен на другой машине в сети |
Использование стандартной библиотеки транслятора
Для работы с файлами в приложениях Windows вы можете использовать функции из стандартной библиотеки транслятора C или C++, такие как read , fread , write , fwrite , lseek , fstat , tell , close .
Можно также использовать функции потокового ввода/вывода , если преобразовать идентификатор файла в указатель на структуру FILE при помощи функции fdopen . Для того чтобы закрыть такой файл следует воспользоваться функцией fclose .
Далее приведена программа которая использует некоторую часть упомянутых функций.
Пример программы:
Ex04.h
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
void button1_click(void);
void button2_click(void);
void button3_click(void);
void button4_click(void);
#define IDC_EDIT1 100
#define IDC_BUTTON1 101
#define IDC_BUTTON2 102
#define IDC_BUTTON3 103
#define IDC_BUTTON4 104
HWND hWnd;
HWND edit1;
HWND button1;
HWND button2;
HWND button3;
HWND button4;
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_COMMAND:
switch(wParam)
{
case IDC_BUTTON1:
button1_click();
break;
case IDC_BUTTON2:
button2_click();
break;
case IDC_BUTTON3:
button3_click();
break;
case IDC_BUTTON4:
button4_click();
break;
}
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
void button1_click(void)
{
char buf[255];
GetWindowsDirectory(buf, sizeof(buf));
SetWindowText(edit1, buf);
}
void button2_click(void)
{
char buf[255];
GetSystemDirectory(buf, sizeof(buf));
SetWindowText(edit1, buf);
}
void button3_click(void)
{
OPENFILENAME ofn;
char szFile[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = NULL;
ofn.nFilterIndex = NULL;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = "D:\\";
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
GetOpenFileName(&ofn);
SetWindowText(edit1, szFile);
}
void button4_click(void)
{
OPENFILENAME ofn;
char szFile[MAX_PATH];
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = NULL;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFilter = NULL;
ofn.nFilterIndex = NULL;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = "D:\\";
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
GetOpenFileName(&ofn);
OFSTRUCT ofs;
OpenFile(szFile, &ofs, OF_DELETE);
}
Ex04.cpp
#include <windows.h>
#include "Ex04.h"
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
HINSTANCE hInst;
LPCSTR AppName = "MyProgramm";
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
hInst = hInstance;
WNDCLASS wc;
ZeroMemory(&wc, sizeof(wc));
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = AppName;
RegisterClass(&wc);
hWnd = CreateWindow(AppName, AppName, WS_OVERLAPPEDWINDOW,
500, 200, 330, 300, NULL, NULL, hInst, NULL);
edit1 = CreateWindow("edit", "", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,
100, 170, 120, 30, hWnd, (HMENU)IDC_EDIT1, hInst, NULL);
button1 = CreateWindow("button", "Получитьпутьк Windows", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
60, 10, 200, 30, hWnd, (HMENU)IDC_BUTTON1, hInst, NULL);
button2 = CreateWindow("button", "Получитьпутьк System32", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
60, 50, 200, 30, hWnd, (HMENU)IDC_BUTTON2, hInst, NULL);
button3 = CreateWindow("button", "Диал.окнооткрытияфайла", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
60, 90, 200, 30, hWnd, (HMENU)IDC_BUTTON3, hInst, NULL);
button4 = CreateWindow("button", "Выбратьиудалитьфайл", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,
60, 130, 200, 30, hWnd, (HMENU)IDC_BUTTON4, hInst, NULL);
ShowWindow(hWnd, SW_SHOW);
UpdateWindow(hWnd);
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returnmsg.wParam;
}
Содержание отчета:
Титульный лист.
Краткое теоретическое описание.
Задание на лабораторную работу, включающее формулировку задачи.
Результаты выполнения работы.
Контрольные вопросы:
Какие функции для работы с файлами в ОС Windowsвы знаете?
Как создать диалоговые окна открытия и сохранения файла?
Чем отличаются функция OpenFile() от функции _lopen()?
Задания для самостоятельной работы:
Номер варианта |
Задание |
1 |
Разработать программу, для работы с базой данных сотрудников предприятия. Всю информацию о сотрудниках содержать в файле. |
2 |
Разработать простой файловый менеджер (использовать компонент listviewили treeview). |
3 |
Разработать программу для сортировки файла по строкам. |
4 |
Разработать файловый поисковик (для вывода найденных файлов использовать компонент listview в форме таблицы). |
5 |
Разработать программу для копирования файлов, используя параллелизм (один поток для чтения, другой для записи).
|
6 |
Разработать программу, которая получит список всех файлов в указанном пользователем каталоге и запишет этот список в файл (поиск файлов и запись их имен в файл выполнять в двух отдельных потоках). |
Приложение
Код ошибки |
Описание |
0x0001 |
Неправильная операция (Invalid function) |
0x0002 |
Файлненайден (File not found) |
0x0003 |
Путь не найден (Path not found) |
0x0004 |
Слишком много открытых файлов (Too many open files) |
0x0005 |
Доступ запрещен (Access denied) |
0x0006 |
Неправильный идентификатор (Invalid handle) |
0x0007 |
Область испорчена (Arena trashed) |
0x0008 |
Малопамяти (Not enough memory) |
0x0009 |
Неправильный блок (Invalid block) |
0x000A |
Плохая среда (Bad environment) |
0x000B |
Плохой формат (Bad format) |
0x000C |
Неправильный доступ (Invalid access) |
0x000D |
Неправильные данные (Invalid data) |
0x000F |
Неправильное устройство (Invalid drive) |
0x0010 |
Текущий каталог (Current directory) |
0x0011 |
В операции перемещения используется другое устройство (Not same device) |
0x0012 |
Больше нет файлов (No more files) |
0x0013 |
Ошибка защиты записи (Write protect error) |
0x0014 |
Плохое устройство (Bad unit) |
0x0015 |
Не готов (Not ready) |
0x0016 |
Неправильная команда (Bad command) |
0x0017 |
С помощью циклического контроля четности обнаружена ошибка (CRC error) |
0x0018 |
Неправильная длина (Bad length) |
0x0019 |
Ошибка позиционирования (Seek error) |
0x001A |
Диск подготовлен не в среде MS-DOS (Not MS-DOS disk) |
0x001B |
Сектор не найден (Sector not found) |
0x001C |
Конецбумаги (Out of paper) |
0x001D |
Ошибка при записи (Write fault) |
0x001E |
Ошибка при чтении (Read fault) |
0x001F |
Общий сбой (General failure) |
0x0020 |
Ошибка при попытке совместного использования файла (Sharing violation) |
0x0021 |
Ошибка при блокировании файла (Lock violation) |
0x0022 |
Неправильный диск (Wrong disk) |
0x0023 |
Недоступенблокуправленияфайлом (File control block unavailable) |
0x0024 |
Превышен допустимый размер разделяемого буфера (Sharing buffer exceeded) |
0x0032 |
Не поддерживается (Not supported) |
0x0033 |
Удаленного абонента нет в списке (Remote not listed) |
0x0034 |
Повторное использование имени (Duplicate name) |
0x0035 |
Плохой сетевой путь (Bad netpath) |
0x0036 |
Сеть занята (Network busy) |
0x0037 |
Устройство не существует (Device does not exist) |
0x0038 |
Слишком много команд (Too many commands) |
0x0039 |
аппаратный сбой адаптера (Adaptor hardware error) |
0x003A |
Плохой ответ от сети (Bad network response) |
0x003B |
Неожиданная ошибка в сети (Unexpected network error) |
0x003C |
Плохой удаленный адаптер (Bad remote adaptor) |
0x003D |
Переполнение очереди печати (Print queue full) |
0x003E |
Мало места для спулинга (No spool space) |
0x003F |
Печать отменена (Print canceled) |
0x0040 |
Сетевое имя удалено (Netname deleted) |
0x0041 |
Сетевой доступ запрещен (Network access denied) |
0x0042 |
Неправильный тип устройства (Bad device type) |
0x0043 |
Неправильное сетевое имя (Bad network name) |
0x0044 |
слишком много имен (Too many names) |
0x0045 |
Слишком много сеансов (Too many sessions) |
0x0046 |
совместное использование приостановлено (Sharing paused) |
0x0047 |
Запроснепринят (Request not accepted) |
0x0048 |
Переназначение приостановлено (Redirection paused) |
0x0050 |
Файл уже существует (File exists) |
0x0051 |
Двойнойблокуправленияфайлом (Duplicate file control block) |
0x0052 |
Не могу сделать (Cannot make) |
0x0053 |
Сбой обработчика прерывания INT 24h (Interrupt 24 failure) |
0x0054 |
Внеструктуры (Out of structures) |
0x0055 |
Уже присвоено (Already assigned) |
0x0056 |
Неправильный пароль (Invalid password) |
0x0057 |
Неправильный параметр (Invalid parameter) |
0x0058 |
Ошибка в сети при записи (Net write fault) |
