Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиС.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
106.71 Кб
Скачать

Позиционирование

Для выполнения операции позиционирования внутри файла приложения 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;

}

Содержание отчета:

  1. Титульный лист.

  2. Краткое теоретическое описание.

  3. Задание на лабораторную работу, включающее формулировку задачи.

  4. Результаты выполнения работы.

Контрольные вопросы:

  1. Какие функции для работы с файлами в ОС Windowsвы знаете?

  2. Как создать диалоговые окна открытия и сохранения файла?

  3. Чем отличаются функция 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)

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]