Розробка програмного забезпечення файлового менеджера - Программирование, компьютеры и кибернетика дипломная работа

Розробка програмного забезпечення файлового менеджера - Программирование, компьютеры и кибернетика дипломная работа




































Главная

Программирование, компьютеры и кибернетика
Розробка програмного забезпечення файлового менеджера

Структура завантажувального запису, службової області FAT, елемента каталогу. Код програми файлового менеджеру. Алгоритм пошуку дисків й іменування дисків, доступу к об'єктам файлової системи, визначення зайнятого місця на розділі, зрівняння директорій.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Масив з 4х елементів Partition Table
Ознака активного розділу (80h - активний / 0 - неактивний)
Початкова доріжка та сектор розділу. 6-бітний номер сектору визначається як 6 молодших бітів молодшого байту, а 10-бітний номер циліндру, як 2 старші біти молодшого байту та розташовані за ним 8 бітів старшого байту
Назва операційної системи, у якій виконано форматування диску
Кількість елементів кореневого каталогу
Розмір диску в секторах для дисків <32MB, інакше 0
Розмір в секторах для дисків > 32MB
Тип пристрою(для першого диску в системі 80h, для інших 0)
Ідентифікатор FAT (`FAT12' або `FAT16')
Назва операційної системи, у якій виконано форматування диску
Початковий кластер кореневого каталогу
Початковий сектор структури FS INFO
Номер сектору з копією BOOT-розділу
Ознака дескриптору: 0 - вільний; E5h - видалений; інше-перший символ імені об'єкту
Час створення або останньої модифікації
Дата створення або останньої модифікації
Молодша частина початкового кластеру об'єкта
Ознака дескриптору: 0 - вільний; E5h - видалений; інше-перший символ імені об'єкту
Дата створення або останньої модифікації
Старший байт номеру першого кластеру, який був виділений об'єкту
Молодший байт номеру першого кластеру, який був виділений об'єкту
Всі необхідні програмні структури представлені в header- файлах. Ціль їхнього створення - організація даних, прочитаних з носіїв. Наприклад, кожний жорсткий диск буде представлений структурою
char nHard; //номер жорсткого диску
void* hDrive; //хендл жорсткого диску
UINT dwSectorSize; //розмір сектора
UINT bitsPerSector; //кількість розрядів для адресації всередині сектора
UINT dwExtendedAddr; //адреса розширеного розділу
Інформація про розділи організується в список структур, по одному списку на кожний жорсткий диск:
} LOGICAL_DISC, *PLOGICAL_DISC, **PPLOGICAL_DISC;
Після того, як FAT32-розділ був відкритий для читання, інформація про нього записується в таку структуру
UINT beginFAT; //адреса початку FAT-таблиці у секторах
UINT nBytePerSector; //розмір сектора у байтах
void* hDrive; //хендл відкритого розділу
char SectPerCluster; //розмір кластера в секторах
UINT BytesPerCluster; //розмір кластера в байтах
UINT sizeFAT; //розмір FAT-таблиці в секторах
UINT* pFAT; //адреса образу FAT-таблиці у ОЗУ
UINT sizeFATbytes; //розмір FAT-таблиці в байтах
USHORT nFATCopy; //кількість копій FAT
USHORT sizeReserved; //розмір зарезервованої області в секторах
UINT bitsPerSector; //кількість розрядів для адресації всередині сектора
UINT RootCluster; //номер першого кластера корневой директории
UINT dwRootDirSize; //кількість кластерів для кореневої директорії
HDIR hRootDir; //хендл кореневої директориії
Список прочитаних файлів організується в структуру:
Якщо необхідно вивести на екран уміст файлу, спочатку його вміст буде відображено в таку структуру:
У цьому пункті розглядаються послідовно алгоритми пошуку та іменування дисків, доступу до об'єктів файлової системи, визначення зайнятого місця для файлової системи FAT32, FAT16.
3.1 Алгоритм пошуку дисків й іменування дисків
Алгоритм іменування логічних дисків засновано на звіренні серійного номера, отриманого логічного диска із серійним номером, збереженим системою.
Рисунок 3.1 - Пошук та найменування дисків
3.2 Алгоритм доступу к об'єктам файлової системи
Основна концепція файлової системи FAT полягає в тім, що кожному файлу й каталогу виділяється структура даних, називана дескриптором. У цій структурі зберігається ім'я файлу, його розмір, початкова адреса вмісту файлу й інші метадані. Данні файлів і каталогів зберігається в блоках даних, називаних кластерами. Якщо файлу або каталогу виділяється більш одного кластера, інші кластери знаходять за допомогою структури даних, називаної FAT(File Allocation Table). Структура FAT використовується як для ідентифікації наступних кластерів у файлах, так і для визначення стану кластерів. Існує три версії FAT: FAT12, FAT16 і FAT32. Вони відрізняються друг від друга насамперед розміром запису у структурі FAT. Зв'язки між структурами даних показано на рис. 3.4.
Рисунок 3.4 - Зв'язки між структурами даних
Файлова система FAT ділиться на три фізичні області для FAT32, та на чотири для FAT12/16. Перша область називається зарезервованою; в FAT12 і FAT16 зарезервована область займає всього 1 сектор, але формально її розмір визначається в завантажувальному секторі. Друга область FAT - містить основні й резервні структури FAT. Вона починається в секторі, котрий розташовано за зарезервованою областю, а її розмір визначається кількістю й розміром структур FAT. Третя - кореневий каталог, для FAT12/16 починається за областю FAT, а у FAT32 має повільне положення у області даних. Область даних - містить кластери, виділені для зберігання файлів і вмісту каталогів.
Доступ до файлових об'єктів виконується з припущення, що відома адреса першого кластеру об'єкту.
У даній реалізації алгоритм доступу до об'єктів містить дві частини - алгоритм пошуку шляху до поточної директорії та алгоритм пошуку об'єктів у завантаженій директорії.
Алгоритм пошуку об'єктів в каталогі наведено на рис. 3.2
Алгоритм пошуку поточного шляху - рис.3.3
Рисунок 3.2 - Алгоритм пошуку об'єктів в каталогі
Рисунок 3.3 - Алгоритм пошуку поточного шляху
3.3 Алгоритм визначення зайнятого місця на розділі
Визначення зайнятого місця на розділі реалізується шляхом аналізу таблиці FAT. Виконується перевірка усіх елементів таблиці FAT. Рахується кількість елементів, що містять 0. Ці елементи в файловій системі ідентифікують незайняте місце.
Отже, після повного перегляду FAT таблиці відома кількість елементів FAT таблиці та кількість елементів незайнятого місця. Знаходиться відсоткове співвідношення. Через нього обчислюється зайняте місце в байтах.
Рисунок 3.4 - Алгоритм визначення зайнятого місця
Рисунок 3.5 - Алгоритм зрівняння директорій
Точка входу знаходиться у модулі з назвою manager.cpp. Після автоматичної ініціалізації графічного інтерфейсу (все це відбувається за рахунок VCL), виконується пошук і іменування всіх логічних дисків. Код, відповідальний за це, знаходиться в модулі mbrmodule.cpp. Далі, якщо знайдено завантажувальний розділ і, якщо файлова система на ньому є однією з підтримуваних, виконується пошук усіх файлів у кореневому каталозі. Якщо файлова система розділу - FAT або FAT32 то робиться це за допомогою модуля fat32.cpp. Якщо файлова система - NTFS, то пошук виконується невеликими функціями, описаними, безпосередньо, у головному модулі (manager.cpp, на таку структуру вже наголошувалося раніше). Інші файлові системи не підтримуються.
Функція виконує всі попередні дії, необхідні для подальшої роботи з жорстким диском(виклик CreateFіle(), визначення розміру сектора й т.д.). У випадку невдачі повертає NULL.
BOOL WalkOnMBR(PHARDINFO inf, PPLOGICAL_DISC first);
Функція проходить по ланцюжку MBR жорсткого диска, попередньо відкритого функцією Іnіt
Звільняє зайняту структурами пам'ять і закриває дескриптор жорсткого диска
Виконує всі необхідні попередні дії для роботи з логічним диском, файлова система котрого FAT або FAT32 (зчитування таблиці FAT, визначення кластера кореневого каталогу та ін.)
UINT GotoDir(PDISC_INFO info, char* cpPath);
Повертає номер кластера виходячи зі шляху до директорії
UINT ListDirectory(PDISC_INFO info, HDIR hDir,UINT dwDirSize,char* cpObjectName, PFILES* ppfiles);
Виконує побудова списку файлів у директорії або пошук елемента каталогу в ній.
PFILES PrintRootDirectory(PDISC_INFO info);
Пошук всіх файлів у кореневому каталозі
HDIR LoadDirectory(PDISC_INFO info, UINT cluster, UINT* dirsize);
Завантажує вміст зазначеного ланцюжка кластерів на згадку
char* Fat32ReadFile(PDISC_INFO info, UINT FirstCluster, UINT* dwFileSize);
Читає вміст файлу, перший кластер котрого відомий
Звільняє зайняту пам'ять і закриває дескриптори.
void AnalyzeError(char* comment, int iErr);
Виконує аналіз помилки, що відбулася, результати виводить в MessageBox головного вікна
void createFolder(PDISC_INFO info,AnsiString newDirName)
Виконує додаткове завдання КП. Створення директорії в FAT16/32. Приймає у якості параметрів структуру інформації про поточний розділ та назву нової директорії. Функція отримує інші необхідні дані та інтерфейс до роботи з раніше створених функцій та глобальних змінних (ознака кореневої директорії, поточний шлях, тип ФС та ін.).
Для навігації серед елементів каталогу та серед списку логічних дисків використовуються дії миші. Для порівняння директорії - окрема кнопка «Сравнение папок». Для вибору поточного диску - випадаючий список з усіма літерами наявних дисків.
Після натискання на кнопку порівняння директорій, замість данних про поточний логічний диск, з'являється інформація щодо відкритих директорій в панелях менеджеру..
При зміні поточного диску відбувається оновлення інформації про диск у правій частині вікна, та якщо зміна диска була у правому вікні, то й там є відновлення. та оновлюється гістограма зайнятого/вільного простору.
Відразу після запуску формується інтерфейс користувача й виводиться вміст кореневого каталогу активного розділу. Виводиться наступна інформація про файли: ім'я файлу, розмір, атрибути.
Також у праві1 частині вікна виводиться деяка інформація про логічний диск.
На гістограмі відображено співвідношення зайнятого й вільного простору логічного диску (рис. 6.1).
Рисунок 6.1 - Список файлів активного каталогу.
Перехід в іншу директорію здійснюється за допомогою мишки (подвійне натискання) або ж натисканням клавіші ENTER (перед цим потрібна директорія повинна бути виділена, цього можна домогтися нажатим клавіш "Нагору" або "Униз" або ж одинарним натисканням лівої клавіші миші, рис.6.2).
Рисунок 6.2 - Список файлів в некореневому каталогі.
Зрівняння ми побачимо, нажавши кнопку «Сравнение папок». Праворуч від панелей буде кількісна інформація щодо кожної панелі. (рис. 6.4).
Рисунок 6.4 - відображення вмісту кількісного зрівняння папок.
У ході виконання курсового проекту була створена програма для ОС Windows. Також були покращені навички роботи з накопичувачем на жорсткому магнітному диску. Був розібраний низький рівень існування інформації на жорсткому диску.
Так як основна увага приділялася роботі з ФС FAT, були здобуті вичерпні знання про структуру цієї ФС та навички роботи з нею на низькому рівні.
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
char DisplayName[]="#Commander from Hell#";
char path[65536], path2[65536], pat[256], pat2[256], nulpat[256]; //pat,pat2 переменные для копирования имени которое будет удалятся из пути
int fil1, fil2, dir1, dir2; // счетчики файлов и папок
void AnalyzeError(char* comment, int iErr)
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ARGUMENT_ARRAY,
0, iErr, 0, locBuf, sizeof(locBuf), 0
if(locBuf[len-2]==0x0D)locBuf[len-2]=0;
wsprintf(s,"%s (%u) %s",comment?comment:"", iErr, locBuf);
MessageBox(hwnd,s,DisplayName,MB_OK);
/*******************************************************************************
* Очистка списка файлов, необходима перед началом работы со списком. *
* Если забыть про очистку, то файлы на экране не очистятся, а новые добавятся *
******************************************************************************
/*******************************************************************************
* Конкретная функция для чтения директории в NTFS-томе *
*******************************************************************************
int NTFSReadDir(PLOGICAL_DISC pld, char* pPath)
PFILES pfirst = NULL, pfiles, ppred = NULL;
if(pPath && pPath[0]!=0)wsprintf(pFullPath+3,pPath);
FindFirstFile(pFullPath,&fd))==INVALID_HANDLE_VALUE)return 0;
pfiles =(_FILES*) malloc(sizeof(FILES));
pfiles->attrib = fd.dwFileAttributes;
pfiles->filesize = fd.nFileSizeLow;
pfiles->ansiname =(char*) malloc(strlen((const char*)&fd.cFileName)+1);
wsprintf(pfiles->ansiname,(const char*)&fd.cFileName);
if(GetLastError() == ERROR_NO_MORE_FILES)
int NTFSReadDir2(PLOGICAL_DISC pld, char* pPath)
PFILES pfirst = NULL, pfiles, ppred = NULL;
if(pPath && pPath[0]!=0)wsprintf(pFullPath+3,pPath);
FindFirstFile(pFullPath,&fd))==INVALID_HANDLE_VALUE)return 0;
pfiles =(_FILES*) malloc(sizeof(FILES));
pfiles->attrib = fd.dwFileAttributes;
pfiles->filesize = fd.nFileSizeLow;
pfiles->ansiname =(char*) malloc(strlen((const char*)&fd.cFileName)+1);
wsprintf(pfiles->ansiname,(const char*)&fd.cFileName);
if(GetLastError() == ERROR_NO_MORE_FILES)
/****************************************************************************
* Получение свободного места в МБ свободного тома, если он в NTFS
**************************************************************************
UINT GetNtfsFreeSpace(PLOGICAL_DISC pld)
__int64 i64FreeBytesToCaller, i64TotalBytes, i64FreeBytes;
if(Sysutils::GetDiskFreeSpaceEx (szdisk,
//Application->MessageBoxA(IntToStr(i64FreeBytes/(1024*1024)).c_str(),IntToStr(i64FreeBytes/(1024*1024)).c_str(),MB_OK);
/*******************************************************************************
* Чтение заданной директории, определение того, какие ф-ции для этого надо *
*******************************************************************************
int ReadDir(PLOGICAL_DISC pld, char* pPath)
ULONG dwDirSize; //размер директории в кластерах
UINT DirCluster; //номер кластера директории
info =(_DISC_INFO*) pld->disc_info;
if((pld->id == 0x07)||(pld->id == 0x17))
if(!pld->prcfree)pld->prcfree = GetNtfsFreeSpace(pld);
if(!(info =(_DISC_INFO*) pld->disc_info = Fat32Init(disc)))
pld->prcfree = ((PDISC_INFO)(pld->disc_info))->prcfree;
hDir=LoadDirectory(info, DirCluster, &dwDirSize);
ListDirectory(info, hDir, dwDirSize, NULL, &pfirst);
else pfirst=PrintRootDirectory(info);
pathh[(strrchr(pathh,'\\')-pathh)]='\0';
strncpy(path+strlen(path)-1,nulpat,1);
int ReadDir2(PLOGICAL_DISC pld, char* pPath)
ULONG dwDirSize; //размер директории в кластерах
UINT DirCluster; //номер кластера директории
info =(_DISC_INFO*) pld->disc_info;
if((pld->id == 0x07)||(pld->id == 0x17))
if(!pld->prcfree)pld->prcfree = GetNtfsFreeSpace(pld);
if(!(info =(_DISC_INFO*) pld->disc_info = Fat32Init(disc)))
pld->prcfree = ((PDISC_INFO)(pld->disc_info))->prcfree;
hDir=LoadDirectory(info, DirCluster, &dwDirSize);
ListDirectory(info, hDir, dwDirSize, NULL, &pfirst);
else pfirst=PrintRootDirectory(info);
pathh[(strrchr(pathh,'\\')-pathh)]='\0';
strncpy(path2+strlen(path2)-1,nulpat,1);
/*-----------------------------------------------------------------------------*/
/*******************************************************************************
*******************************************************************************
while(inf = hdd[nHDD] = Init(nHDD))
iRetVal = Form1->CBDiskName->ItemIndex;
iRetVal = Form1->CBDiskName2->ItemIndex;
/*-----------------------------------------------------------------------------*/
/*******************************************************************************
*******************************************************************************
PLOGICAL_DISC FindDiskByChar(char disk)
/*-----------------------------------------------------------------------------*/
/*******************************************************************************
*Поиск диска по его индексу, вызывается, когда происходит смена текущего диска*
*******************************************************************************
PLOGICAL_DISC FindDiskByIndex(char index)
/*******************************************************************************
* Поиск файла в заранее сформированном списке по его индексу *
*******************************************************************************
/*******************************************************************************
* Ложимся спать и освобождаем все, что загадили. *
*******************************************************************************
if(pld->disc_info)Fat32DeInit((_DISC_INFO*)pld->disc_info);
/*****************************************************************************/
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
/*******************************************************************************
* Функция списка действий, обновление списка дисков. Выполняет полное *
* полное обновление, аналогично, как и при запуске программы. *
*******************************************************************************
void __fastcall TForm1::ARefreshListExecute(TObject *Sender)
while(inf = hdd[nHDD] = Init(nHDD))
/*******************************************************************************
* При первом показе формы устанавливает текущий диск как индекс значения в *
* списке дисков, это значение всегда используется для получения номера диска. *
*******************************************************************************
void __fastcall TForm1::FormShow(TObject *Sender)
/*******************************************************************************
* Вывод файлов на панель, функция списка действий *
*******************************************************************************
void __fastcall TForm1::APrintFileListExecute(TObject *Sender)
Form1->Label11->Caption=currpld->cpFS;
Form1->Label12->Caption=currpld->mbLength;
Form1->Label13->Caption=currpld->abs_addr;
Form1->Label14->Caption=currpld->prcfree;
//Form1->LBFileList->Items->SetText("");
if(pfiles->attrib & FILE_ATTRIBUTE_DIRECTORY){wsprintf(sz,""); dir1++;}
else {wsprintf(sz,"%u",pfiles->filesize); fil1++;}
//if (!strstr("..",pfiles->ansiname )) dir1-=2;
if(pfiles->attrib & FILE_ATTRIBUTE_DIRECTORY)
wsprintf(s,"[%-18s] %#10s %02X",pfiles->ansiname,sz,pfiles->attrib);
wsprintf(s,"%-20s %#10s %02X",pfiles->ansiname,sz,pfiles->attrib);
Form1->LBFileList->Items->Add(AnsiString(s));
if (strlen(s)>maxx) maxx=strlen(s);
Form1->LBFileList->ScrollWidth=maxx*8+10;
Form1->Edit1->Text = Form1->CBDiskName->Text+'\\';
void __fastcall TForm1::APrintFileListExecute2(TObject *Sender)
Form1->LBFileList2->Items->Clear();
if(pfiles->attrib & FILE_ATTRIBUTE_DIRECTORY){wsprintf(sz,""); dir2++;}
else {wsprintf(sz,"%u",pfiles->filesize);/*ltoa((ULONG)pfiles->filesize,sz,10); */fil2++;}
if(pfiles->attrib & FILE_ATTRIBUTE_DIRECTORY)
wsprintf(s,"[%-18s] %#10s %02X",pfiles->ansiname,sz,pfiles->attrib);
wsprintf(s,"%-20s %#10s %02X",pfiles->ansiname,sz,pfiles->attrib);
Form1->LBFileList2->Items->Add(AnsiString(s));
if (strlen(s)>maxx) maxx=strlen(s);
Form1->LBFileList2->ScrollWidth=maxx*8+10;
Form1->Edit2->Text = Form1->CBDiskName2->Text+'\\';
//if (strlen(path2) > 1) dir2 -= 2;
*******************************************************************************
* Обработчик изменения имени диска в выпадающем списке вверху. Обновляются все*
*******************************************************************************
void __fastcall TForm1::CBDiskNameChange(TObject *Sender)
currpld=FindDiskByChar(*(CBDiskName->Text.SubString(0,1).c_str()));
CGauge1->Progress=100-currpld->prcfree/(currpld->mbLength/100);
void __fastcall TForm1::CBDiskName2Change(TObject *Sender)
currpld2=FindDiskByChar(*(CBDiskName2->Text.SubString(0,1).c_str()));
/*******************************************************************************
* Обработчик двойного щелчка на области панели с файлами, обрабатываем только *
*******************************************************************************
void __fastcall TForm1::LBFileListDblClick(TObject *Sender)
mfile = FindFileByIndex(iSelected);
/*Реагируем только на вход в директорию и на выход из нее */
if((strlen(path)==1) || ((strlen(path)>1)&&(iSelected>0)))
if((strlen(mfile->ansiname)+strlen(path)+3)>sizeof(path))return;
wsprintf(bufferstr,mfile->ansiname);
if(strlen(path) == 0) strcat(path, "\\");
Form1->Edit1->Text = Form1->CBDiskName->Text+path;
//---------------------------------------------------------------------------
void __fastcall TForm1::LBFileList2DblClick(TObject *Sender)
iSelected2 = LBFileList2->ItemIndex;
mfile = FindFileByIndex2(iSelected2);
/*Реагируем только на вход в директорию и на выход из нее */
if((strlen(path2)==1) || ((strlen(path2)>1)&&(iSelected2>0)))
if((strlen(mfile->ansiname)+strlen(path2)+3)>sizeof(path2))return;
wsprintf(bufferstr,mfile->ansiname);
while((ptr - path2) < strlen(path2))
while((ptr - path2) < strlen(path2))
if(strlen(path2) == 0) strcat(path2, "\\");
while((ptr - path2) < strlen(path2))
while((ptr - path2) < strlen(path2))
while((ptr - path2) < strlen(path2))
Form1->Edit2->Text = Form1->CBDiskName2->Text+path2;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
//---------------------------------------------------------------------------
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL Fat32DataRead(PDISC_INFO info, char* buf, UINT bufsize)
BOOL bRetValue=ReadFile(info->hDrive, buf, bufsize,(unsigned long*) &nRead, NULL);
if(!bRetValue)AnalyzeError("# Error at ReadFile: ",GetLastError());
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//сдвинуть указатель внутри раздела
UINT Fat32DataMovePointer(PDISC_INFO info, UINT secpointer)
UINT HiPointer=secpointer>>(32-info->bitsPerSector);
UINT LoPointer=secpointer<<(info->bitsPerSector);
UINT bRetValue=SetFilePointer(info->hDrive,LoPointer,(long*)&HiPointer,FILE_BEGIN);
if(iErr!=NO_ERROR)AnalyzeError("# Error at SetFilePointer: ",iErr);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//найти следующий элемент цепочки кластеров
UINT GetNextFileCluster(PDISC_INFO info, UINT nCurrCluster)
if(info->bFAT16)nextcluster = ((USHORT*)(info->pFAT))[nCurrCluster];
else nextcluster = info->pFAT[nCurrCluster];
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
UINT Cluster2Sector(PDISC_INFO info, UINT cluster)
(cluster-2)*(info->SectPerCluster);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
char* Fat32ReadFile(PDISC_INFO info, UINT FirstCluster, ULONG* dwFileSize)
char* retval = LoadDirectory(info, FirstCluster, dwFileSize);
if(dwFileSize)*dwFileSize = (*dwFileSize)*(info->BytesPerCluster);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
UINT WalkOnFATTable(PDISC_INFO info, UINT FirstCluster, UINT* LastCluster, UINT* nClusters)
currCluster=GetNextFileCluster(info, currCluster);
if(info->bFAT16 && (currCluster>=0xfff8))break;
if(currCluster!=(predCluster+1))fragments++;
if(LastCluster)*LastCluster=predCluster;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
HDIR LoadDirectory(PDISC_INFO info, UINT cluster, ULONG* dirsize)
nClusters = 1 + (info->nRootElements * 32) / info->BytesPerCluster;
dwSize = nClusters * info->BytesPerCluster;
WalkOnFATTable(info,cluster,NULL,&nClusters);
dwSize=(info->BytesPerCluster)*nClusters;
sector = Cluster2Sector(info, currCluster);
if(Fat32DataMovePointer(info,sector)==-1)
if(!Fat32DataRead(info,hDir+i*(info->BytesPerCluster),info->BytesPerCluster))
currCluster = GetNextFileCluster(info,currCluster);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
UINT dwSize=(info->sizeFAT)*(info->nBytePerSector);
if(Fat32DataMovePointer(info,info->beginFAT)==-1)return 0;
info->pFAT=(unsigned int*)malloc(dwSize);
if(!Fat32DataRead(info,(char*)(info->pFAT),dwSize))
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//если pObjectName==NULL то печатает содержимое директории, находящейся в памяти
//если pObjectName!=NULL ищет в директории директорию с именем pObjectName
UINT ListDirectory(PDISC_INFO info, HDIR hDir,UINT dwDirSize,char* cpObjectName, PFILES* ppfiles)
USHORT firstclusterLo,firstclusterHi;
PFILES pfiles, pfirst=NULL, ppred=NULL;
for(i=0;i<(dwDirSize*(info->BytesPerCluster))/32;i++)
if((p[0]==0xE5) || (p[0] == 0x8F) || (p[11]) == '\b')
firstcluster=(firstcluster<<16)+firstclusterLo;
pfiles =(_FILES*) malloc(sizeof(FILES));
pfiles->firstcluster = firstcluster;
WideCharToMultiByte(CP_ACP,0,(LPCWSTR)uname,-1,ansiname,sizeof(ansiname),NULL,NULL);
if((!strcmpi(cpObjectName,ansiname)) &&
strcpy(pfiles->ansiname, ansiname);
if((p[0]&0x40)&&((p+32)[11]==0x0F))
t=p; h=0; memset(uname,0,sizeof(uname));
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
double GetFreeSpaceEx(PDISC_INFO info)//
double clusters = info->sizeFATbytes / 4;
RET=(freeclusters * info->BytesPerCluster);
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//инициализирует структуру DISC_INFO
char LogicalDiskName[]="\\\\.\\X:";
PDISC_INFO info=(_DISC_INFO*)malloc(sizeof(DISC_INFO));
FILE_SHARE_READ | FILE_SHARE_WRITE,
if(info->hDrive==INVALID_HANDLE_VALUE)
AnalyzeError("# Error at CreateFile: ",GetLastError());
GetDiskFreeSpace(RootDir,NULL,(unsigned long*)&(info->nBytePerSector),NULL,NULL);
if(!Fat32DataRead(info, buf, info->nBytePerSector))
if((signature3==0x29) && (signature1!=0x29))
//printf("YAAHO!! FAT16!!!!!!!!!");
info->nRootElements = *(short*)&buf[17];
Огляд Windows 95/98: загальні відомості, аналіз файлової системи. Розробка програми, що виконує всі основні функції файлового менеджера та може використовуватись як повноцінний програмний продукт даного типу. Установка та умови застосування програми. курсовая работа [360,6 K], добавлен 17.10.2013
Перегляд секторів диску за допомогою програми Disk Editor. Характеристика завантажувального запису BR, FAT-таблиці та кореневого каталогу як основних зон системної області файлової структури операційної системи для дискети стандартного формату 3.5'. лабораторная работа [59,7 K], добавлен 11.12.2010
Призначення, принцип дії та класифікація антивірусних програм, робота в їх середовищі. Записування інформації на оптичні носії. Послідовність процесу копіювання дисків. Етапи форматування жорстких магнітних дисків. Робота програми Nero StartSmart. презентация [1,3 M], добавлен 25.12.2014
Набори структур даних, використовуваних для управління файлами. Права доступу до файлу. Монітор файлової системи Process Monitor. Управління аудитом в ОС Windows та в ОС Linux. Доступ до служби каталогів. Практичне застосування Process Monitor. курсовая работа [695,9 K], добавлен 09.01.2014
Мета, задачі та принципи створення інформаційних систем. Бібліотечні системи на Україні. Перелік вхідних та вихідних даних, вибір СУБД, структура програмного забезпечення АРМ. Визначення трудомісткості, тривалості та витрат на розробку програми. дипломная работа [2,1 M], добавлен 19.11.2010
Аналіз функціонування файлового менеджера WINDOWS COMMANDER. Ключові якості програми: операцї з файлами, управління архівами, локальні меню, вбудований FTP-клієнт. З'днання з іншим комп'ютером. Контрольні суми. Функції різних версій WINDOWS COMMANDER. дипломная работа [48,2 K], добавлен 14.12.2007
Розробка гнучкої інтегрованої автоматизованої системи доступу до каталогу навчальних відеофільмів в мультимедійних класах металургійного факультету Національної металургійної академії. Теоретичні аспекти проектування додатків на базі платформи dotNET. дипломная работа [4,0 M], добавлен 26.10.2012
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2021



Розробка програмного забезпечення файлового менеджера дипломная работа. Программирование, компьютеры и кибернетика.
Дипломная работа по теме Юридична відповідальність за порушення екологічного законодавства
Реферат: Безопасность жизнедеятельности,основные вопросы
Курсовая работа по теме Учёт поступления и выбытия нематериальных активов
Реферат по теме Висцеральный сифилис
Экономика И Социология Труда По Предмету Реферат
Неуверенность В Себе Сочинение 9.3 Лубенец
Курсовая работа по теме Особенности бухгалтерского учета в банках
Курсовая работа по теме Технические параметры, которыми характеризуются цифровые видеокамеры
Характеристика Кафе Отчет По Практике
Сочинение По Повести Карамзина
Отчет По Гостиничной Практике
Дипломная работа по теме Модель обмена информацией налоговых органов и органов государственной регистрации прав собственности на недвижимое имущество
Контрольная Работа Атмосфера 6 Класс Ответы
Геометрия Контрольная Работа 6 8 Класс
Мини Сочинение На Тему Песня
Контрольная Работа На Тему Возникновение Древнерусского Государства
Курсовая работа: Монтаж и обслуживание современного электрооборудования и электрических сетей машиностроительного
Реферат: Аналогии пугачевщины в «Капитанской дочке» и действительных событиях
Сочинение: Толстой Собрание сочинений том 17 избранные публицистические статьи
Курсовая работа: Трьох- і чотирьох хвильове розсіяння світла на поляритонах в кристалах ніобіту літію з домішками
Арабо-персидская культура - Культура и искусство презентация
Автобиографические черты в рассказах Уильяма Сарояна - Литература реферат
Методы стратегического финансового контроллинга - Менеджмент и трудовые отношения курсовая работа


Report Page