- •Void gld()
- •Void glds()
- •Void getDType(char *s)
- •Void getVolumeInf(char *s)
- •Void getDiskSize(char *s)
- •Void SetFAttributes(char *s)
- •Void GetFInformationByHandle(char *s)
- •Void GetFTime(char *s)
- •Void SetFTime(char *s)
- •3.2 Копирование файла с помощью операций перекрывающегося ввода-вывода.
- •Void main()
Void GetFTime(char *s)
{
FILETIME creationTime, lastAccessTime, lastWriteTime;
SYSTEMTIME localCreationTime, localAccessTime, localWriteTime, UTClocalCreationTime, UTClocalAccessTime, UTClocalWriteTime;
HANDLE FileHandle = CreateFileA(s, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (!GetFileTime(FileHandle, &creationTime, &lastAccessTime, &lastWriteTime))
{
cout << "Error!";
return;
}
else
{
if (!FileTimeToSystemTime(&creationTime, &UTClocalCreationTime))
{
cout << "\nError creation time!";
return;
}
else
{
SystemTimeToTzSpecificLocalTime(NULL, &UTClocalCreationTime, &localCreationTime);
cout << "\nCreation time: " << localCreationTime.wDay << "." << localCreationTime.wMonth << "." << localCreationTime.wYear
<< ' ' << localCreationTime.wHour << ":" << localCreationTime.wMinute << ":" << localCreationTime.wSecond;
}
if (!FileTimeToSystemTime(&lastAccessTime, &UTClocalAccessTime))
{
cout << "\nError last access time!";
return;
}
else
{
SystemTimeToTzSpecificLocalTime(NULL, &UTClocalAccessTime, &localAccessTime);
cout << "\nLast access time: " << localAccessTime.wDay << "." << localAccessTime.wMonth << "." << localAccessTime.wYear
<< ' ' << localAccessTime.wHour << ":" << localAccessTime.wMinute << ":" << localAccessTime.wSecond;
}
if (!FileTimeToSystemTime(&lastWriteTime, &UTClocalWriteTime))
{
cout << "\nError last write time!";
return;
}
else
{
SystemTimeToTzSpecificLocalTime(NULL, &UTClocalWriteTime, &localWriteTime);
cout << "\nLast write time: " << localWriteTime.wDay << "." << localWriteTime.wMonth << "." << localWriteTime.wYear
<< ' ' << localWriteTime.wHour << ":" << localWriteTime.wMinute << ":" << localWriteTime.wSecond;
}
}
CloseHandle(FileHandle);
}
Void SetFTime(char *s)
{
FILETIME fTime, fCreationTime;
SYSTEMTIME sTime, sCreationTime;
HANDLE FileHandle = CreateFileA(s, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
GetSystemTime(&sTime);
SystemTimeToFileTime(&sTime, &fTime);
if (!SetFileTime(FileHandle, &fTime, &fTime, &fTime))
{
cout << "\nError!";
return;
}
else
cout << "\nTime was changed!";
CloseHandle(FileHandle);
}
3.2 Копирование файла с помощью операций перекрывающегося ввода-вывода.
Проверка программы.
Графики зависимости времени от размера блока копируемых данных и количества перекрывающихся операций.
Размер копируемого файла 800 Мб.
График зависимости времени от количества перекрывающихся операций для размера блока 4 МБ:
Анализ приложения и его объектов.
Вывод: в ходе работы было написано приложение, которое позволяет копировать файл, «одновременно» выполняя несколько перекрывающихся операций ввода-вывода.
Был построен график зависимости времени от размера копируемых блоков, из которого видно, что при увеличении размера блока время уменьшается; также был построен график зависимости времени от количества перекрывающихся операций для блоков размером 4 Мбайта, по которому можно определить оптимальное количество перекрывающихся операций.
Был проведен анализ объектов, используемых приложением с помощью утилиты LiveKD.
Код программы.
#include <iostream>
#include <conio.h>
#include <Windows.h>
#pragma comment(lib, "winmm.lib")
using namespace std;
int BLOCK_SIZE, MAX_OVR;
HANDLE inFileHandle, outFileHandle;
OVERLAPPED *ovrIn, *ovrOut;
CHAR **buf;
LONGLONG nRecords, nDoneRead, nDoneWrite;
LARGE_INTEGER fileSize;
VOID WINAPI ReadCallback(DWORD error, DWORD countOfBytes, LPOVERLAPPED pOvr);
VOID WINAPI WriteCallback(DWORD error, DWORD countOfBytes, LPOVERLAPPED pOvr);
HANDLE CreateF(bool);
