Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Текст програми






#include " StdAfx.h"

#include " Disc.h"

 

CDisc:: CDisc(void): m_hFile(NULL)

{

}

CDisc:: ~CDisc(void)

{

}

void CDisc:: GetDevice()//функція для отримання системної інформації про носії

{

m_DeviseList.empty();

//очистка списку пристроїв

DWORD dw = GetLogicalDriveStrings(0, NULL);

// визначаємо тип зміної функції

TCHAR *str; // визначаємо типу зміної

str = new TCHAR[dw];

GetLogicalDriveStrings(dw, str); //отримаємо характеристики пристрою

bool bSave = true; //задання зміної для перевірки

for(DWORD i=0; i< dw; i++) //цикл на перревірку значення дескриптору

{

if((str[i] == '\0')& & (str[i+1] == '\0')) //якщо значення дескриптору пусте

break; //преривання

if(bSave) //якщо значення відрізняється від \0

{

CString strD(& str[i]);

if(GetDriveType(strD)==DRIVE_FIXED) //отримання типу пристрою

m_DeviseList.push_back(strD); //отримання значення списку пристрою

bSave = false; //якщо умога виконалася

}

if(str[i] == '\0') //перевірка значення дескриптору

bSave = true;

}

delete[] str; //очищення пам’яті

}

int CDisc:: CheckDisc(CString strDisc, LONG lBegin, LONG lEnd, CTestInterface* pInterface)

{

if(strDisc[strDisc.GetLength()-1]=='\\') //перевірка на назву

strDisc.Delete(strDisc.GetLength()-1); //пристрою

CString str; //перенастроювання типу зміної

str.Format(_T(" \\\\.\\%s"), strDisc); //формат визначення диску

m_hFile=CreateFile(str, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, //виконуємо відкриття пристрою

NULL, OPEN_EXISTING, 0, NULL);

CAutoVectorPtr< BYTE> pArray; //визначення типу масиву

pArray.Allocate(512); //задання розрядності

DWORD dwRead; //задаємо тип змінної

if(! ReadFile(m_hFile, pArray, 512, & dwRead, NULL)) //перевірка значення отримане від функції

{

return 1; //повертає помилку

}

SYSTEMTIME tBegin; // визначаємо змінну для визначення початку тестування

GetSystemTime(& tBegin); // визначаємо значення часу початку текстування

SetFilePointer(m_hFile, 1*18*80*512, NULL, FILE_BEGIN); //встановлюємо показчик файлу на задану позицію

if(! ReadFile(m_hFile, pArray, 512, & dwRead, NULL)) //якщо неможливо звернутися до пристрою(прочитати файл)

{

return 1; //повертає помилку

}

SYSTEMTIME tEnd; // опис змінної для зберіганя часу закінчення тестування

GetSystemTime(& tEnd); // визначаємо час кінця тестуваняя

m_dwTime = (tEnd.wHour - tBegin.wHour)*60*60*1000+(tEnd.wMinute - tBegin.wMinute)*60*1000+(tEnd.wSecond - tBegin.wSecond)*1000+(tEnd.wMilliseconds - tBegin.wMilliseconds);

// визначаємо загальний час тестування

// опис змінних

m_pInterface = pInterface;

m_lBegin = lBegin;

m_lEnd = lEnd;

_beginthread(RunThread, 0, this); //вказівник на створення нитки

return 0;

}

void CDisc:: Test()

{

SetFilePointer(m_hFile, m_lBegin*512, NULL, FILE_BEGIN); //встановлюємо показчик файлу на задану позицію

LONG lPoint = m_lBegin; //визначаємо тип зміної, та передаємо значення

 

int ind_st=lPoint; // визначаємо лівий індекс

int ind_end=m_lEnd; // визначаємо правий індекс для визначення адреси сектора методом «butterfly»

int sec_count=m_lEnd-lPoint; // визначаємо кількість секторів, що підлягають тестуванню

for(int ii=0; ii< sec_count; ii++) // цикл по всім секторам, які необхідно протестувати

{

if(ii % 2 == 0) // якщо індекс парний

{

if(ii == 0){ // якщо перший елемент

lPoint = ind_st; // задаємо початковий індекс без прирощення

}

else{

ind_st=ind_st+1; // прирощення на 1 індекса зліва

lPoint = ind_st; // задаємо новий індекс

}

}

else {

if(ii == 1){

lPoint = ind_end; // якщо 2 елемент, індекс без прирощення

}

else{

ind_end=ind_end-1; // прирощення на -1 індекса

lPoint = ind_end; // задаємо новий індекс

}

}

BYTE pArray[512]; // створення масиву розміром сектора

DWORD dwRead; // опис змінної

ReadFile(m_hFile, pArray, 512, & dwRead, NULL); // читаємо сектор

SetFilePointer(m_hFile, lPoint*512, NULL, FILE_BEGIN); // встановлюємо вказівник на необхідний сектор

BYTE pK1[512];

memset(pK1, 0xFFFF, sizeof pK1);
// готуємо масив для запису у сектор

WriteFile(m_hFile, pK1, 512, & dwRead, NULL);

//запис у сектор

BYTE pRead[512];

SetFilePointer(m_hFile, lPoint*512, NULL, FILE_BEGIN);

// встановлюємо вказівник на необхідний сектор

ReadFile(m_hFile, pRead, 512, & dwRead, NULL);

//Читаємо сектор

SetFilePointer(m_hFile, lPoint*512, NULL, FILE_BEGIN);

// встановлюємо вказівник на необхідний сектор

WriteFile(m_hFile, pArray, 512, & dwRead, NULL);

// відновлюємо сектор

// перевірка зп/читання

int nStatus = 0;

if(memcmp(pK1, pRead, sizeof pK1)! =0)//якщо масиви не співпадають

{

// MessageBox(NULL, _T(" Битый сектор"), 0, 0);

nStatus = 1; // встановлюємо флаг помилик

}

 

m_pInterface-> CallBack(m_lBegin, m_lEnd, lPoint, nStatus);

//підключаємо значення к інтерфейсу

}

m_pInterface-> CallBack(m_lBegin, m_lEnd, lPoint, 0);

//усе гаразд, сектори прочитані без помилок

}

void CDisc:: RunThread(void*pThis) //функція запуску нитки

{

CDisc *pDisc = static_cast< CDisc*> (pThis); //втановлюємо показчик

pDisc-> Test();

}

//підключаємо функцію отримання системної інформації про носій

void CDisc:: GetDiskSpace(CString strDisc, DWORD& dwSectorsPerCluster, DWORD& dwBytesPerSector, DWORD& dwNumberOfFreeClusters, DWORD& dwTotalNumberOfClusters)

{

GetDiskFreeSpace(strDisc, & dwSectorsPerCluster, & dwBytesPerSector, & dwNumberOfFreeClusters, & dwTotalNumberOfClusters);

}

void CDisc:: GetDiscInformation(CString strDisk, CString& strName, DWORD& dwSerialNumber, DWORD& dwMaxCompName, CString& strFileSystem)

{

DWORD dwFileSistem;

GetVolumeInformation(strDisk, strName.GetBufferSetLength(MAX_PATH+1), MAX_PATH+1, & dwSerialNumber, & dwMaxCompName, & dwFileSistem, strFileSystem.GetBufferSetLength(MAX_PATH+1), MAX_PATH+1);

strName.ReleaseBuffer();

strFileSystem.ReleaseBuffer();

}

3.2 Отримані результати

Рисунок 1 – Вибір накопичувача та ввід даних.

 

Рисунок 2 – Процес тестування.

Рисунок 3 – Тестування закінчено.

 

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.