Автор: Пользователь скрыл имя, 29 Апреля 2013 в 11:44, курсовая работа
Данный программный продукт разрабатывается для того, чтобы работать с имеющимися дисками и их файловыми системами, осуществлять такие действия как копирование, перемещение, удаление файлов и папок, создание новых папок, а также наглядно отображать имеющиеся на дисках файлы и папки как в виде дерева, так и виде таблицы. Причём необходимо предусмотреть переключение между деревом и таблицей. Также необходимо дать пользователю возможность вводить путь к интересующей его папке. И необходимо отображать текущую папку с полным путём к ней. Необходимо предусмотреть возможность выбора диска из имеющихся в компьютере. Действия должны осуществляться как с помощью меню, так и с помощью пиктограмм панели управления.
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ 3
1.1. Введение 3
1.2. Основания для разработки 3
1.3. Назначение разработки 3
1.4. Требования к программе или программному изделию 3
1.5. Условия эксплуатации 4
1.6. Требования к составу и параметрам технических средств 4
1.7. Требования к информационной и программной совместимости 4
1.8. Требования к программной документации 5
1.9. Стадии и этапы разработки 5
2. ИССЛЕДОВАТЕЛЬСКАЯ ЧАСТЬ 7
2.1. Постановка задачи 7
2.2. Общие сведения 7
2.3. Файловые системы 8
3. КОНСТРУКТОРСКАЯ ЧАСТЬ 12
3.1. Общие сведения 12
3.2. Руководство программиста 12
3.2.1. Структура программы 12
3.2.2. Структуры данных 13
3.2.3. Средства обмена данными 14
3.2.4. Реализация пользовательского интерфейса программы 15
3.2.5. Функции работы с файловой системой 20
4. ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ 22
4.1. Обращение к программе 22
4.2. Входные данные 22
4.3. Выходные данные 22
4.4. Руководство пользователя 22
4.6.1. Назначение программы 22
4.6.2. Требования к аппаратной и программной средам 22
4.6.3. Выполнение программы 23
4.6.4. Сообщения пользователю 28
5.ЛИТЕРАТУРА 30
6.ПРИЛОЖЕНИЕ 31
char ddd[1024];
strcpy(ddd,FindFullPath ("", hwndTreeView, hSelectedItem));
SetWindowText(hwndEdit, ddd);
strcpy(CurrDir1,ddd);
break;
}
}
else if ( hSender == hwndListView1 ) //источник - ListView1
{
switch (((NMHDR*)lParam)->code)
{
case NM_DBLCLK:
OnDblClick(hwndListView1,
break;
case NM_SETFOCUS:
SetWindowText(hwndEdit, CurrDir1);
SendMessage(hwndToolBar, TB_ENABLEBUTTON, IDI_NEW, TRUE);
if (ListView_GetSelectionMark(
Activate();
break;
case LVN_ITEMCHANGED:
Activate();
break;
case NM_KILLFOCUS:
DisActivate();
SendMessage(hwndToolBar, TB_ENABLEBUTTON, IDI_NEW, FALSE);
break;
case LVN_COLUMNCLICK:
NMLISTVIEW *NMLV;
NMLV = (NMLISTVIEW *) lParam;
if (CurrDir1[0]!='\0')
ListView_SortItems(
break;
case LVN_ENDLABELEDIT:
if (pdi->item.pszText != NULL)
{
ListView_GetItemText(
strcpy(csFirst,CurrDir1);
strcat(csFirst,pdi->item.
strcpy(pdi->item.pszText,
strcpy(csFirst,CurrDir1);
strcat(csFirst,csNameFile);
strcpy(csName,csFirst);
ListView_GetItemText(
if (strcmp(csFirst,csSDir)!=0)
{
strcat(pdi->item.pszText,".");
strcat(pdi->item.pszText,
strcat(csName,".");
strcat(csName,csFirst);
}
iError=rename(csName,pdi->
if (iError==0) // -------------- EACCES
{
if (strrchr(pdi->item.pszText,'.'
strrchr(pdi->item.pszText,'.')
pdi->item.pszText=strrchr(pdi-
for (int i=1;pdi->item.pszText[i-1]!='\
pdi->item.pszText[i-1]=pdi->
ListView_SetItemText(
}
else
{
::MessageBox(NULL,
"Невозможно задать такое имя папки",
"Ошибка" ,
MB_ICONERROR | MB_OK | MB_TASKMODAL);
strcpy(pdi->item.pszText,
}
}
break;
}
}
else if ( hSender == hwndListView2 ) //источник - ListView2
{
pdi = (LV_DISPINFO *)lParam;
switch (((NMHDR*)lParam)->code)
{
case NM_DBLCLK:
OnDblClick(hwndListView2,
break;
case NM_SETFOCUS:
SetWindowText(hwndEdit, CurrDir2);
SendMessage(hwndToolBar, TB_ENABLEBUTTON, IDI_NEW, TRUE);
if (ListView_GetSelectionMark(
Activate();
break;
case LVN_ITEMCHANGED:
Activate();
break;
case NM_KILLFOCUS:
DisActivate();
SendMessage(hwndToolBar, TB_ENABLEBUTTON, IDI_NEW, FALSE);
break;
case LVN_COLUMNCLICK:
NMLISTVIEW *NMLV2;
NMLV2 = (NMLISTVIEW *) lParam;
if (CurrDir2[0]!='\0')
ListView_SortItems(
break;
case LVN_ENDLABELEDIT:
if (pdi->item.pszText != NULL)
{
ListView_GetItemText(
strcpy(csFirst,CurrDir2);
strcat(csFirst,pdi->item.
strcpy(pdi->item.pszText,
strcpy(csFirst,CurrDir2);
strcat(csFirst,csNameFile);
strcpy(csName,csFirst);
ListView_GetItemText(
if (strcmp(csFirst,csSDir)!=0)
{
strcat(pdi->item.pszText,".");
strcat(pdi->item.pszText,
strcat(csName,".");
strcat(csName,csFirst);
}
iError=rename(csName,pdi->
if (iError==0) // -------------- EACCES
{
if (strrchr(pdi->item.pszText,'.'
strrchr(pdi->item.pszText,'.')
pdi->item.pszText=strrchr(pdi-
for (int i=1;pdi->item.pszText[i-1]!='\
pdi->item.pszText[i-1]=pdi->
ListView_SetItemText(
}
else
{
::MessageBox(NULL,
"Невозможно задать такое имя папки",
"Ошибка" ,
MB_ICONERROR | MB_OK | MB_TASKMODAL);
strcpy(pdi->item.pszText,
}
}
break;
}
}
return 0;
break;
case WM_TIMER:
SYSTEMTIME iTime;
LPSTR timeget;
GetLocalTime(&iTime);
timeget = (LPSTR) GlobalAlloc(GPTR, 20);
GetTimeFormat(
LOCALE_SYSTEM_DEFAULT,
LOCALE_NOUSEROVERRIDE | TIME_FORCE24HOURFORMAT,
NULL, // time
NULL, // time format string
timeget, // formatted string buffer
20 // size of string buffer
);
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM) 1 | 0, (LPARAM) (LPSTR) timeget);
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message,wParam,lParam);
}
return 0;
}
LRESULT EditWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == WM_KEYDOWN && wParam == VK_RETURN)
{
GoTo(hwndListView1,CurrDir1,
return 0;
}
else
{
return CallWindowProc(hEditProc, hWnd, uMsg, wParam, lParam);
};
};
void OnResize()
{
RECT r;
RECT cr;
INT piParts[2];
GetClientRect(mainhwnd, &cr);
piParts[1] = cr.right - GetSystemMetrics(SM_CXVSCROLL)
piParts[0] = piParts[1] - 80;
SendMessage(hwndStatus, SB_SETPARTS, 2, (LPARAM) piParts);
GetWindowRect(hwndToolBar, &r);
cr.top += (r.bottom - r.top);
GetWindowRect(hwndStatus, &r);
cr.bottom -= (r.bottom - r.top);
MoveWindow(hwndComboBox1, cr.left, cr.top, (cr.right - cr.left)/2, cr.bottom - cr.top, TRUE);
MoveWindow(hwndComboBox2, cr.left+(cr.right - cr.left)/2, cr.top, (cr.right - cr.left)/2, cr.bottom - cr.top, TRUE);
GetWindowRect(hwndComboBox1, &r);
cr.top += (r.bottom - r.top);
GetWindowRect(hwndStatus, &r);
cr.bottom -= (r.bottom - r.top);
MoveWindow(hwndTreeView, cr.left, cr.top, (cr.right - cr.left)/2, cr.bottom - cr.top, TRUE);
MoveWindow(hwndListView1, cr.left, cr.top, (cr.right - cr.left)/2, cr.bottom - cr.top, TRUE);
ShowWindow(hwndListView1, MyTree ? SW_HIDE : SW_SHOW);
ShowWindow(hwndTreeView, MyTree ? SW_SHOW : SW_HIDE);
MoveWindow(hwndListView2, cr.left+(cr.right - cr.left)/2, cr.top, (cr.right - cr.left)/2, cr.bottom - cr.top, TRUE);
MoveWindow(hwndEdit,cr.left+2, cr.bottom, cr.right - cr.left-2, 20,TRUE);
};
//помещает имена дисков в ComboBox-ы
void DiskBrows()
{
DWORD dwDisks;
TV_INSERTSTRUCT TV_
TV_ITEM TV_Item;
dwDisks = GetLogicalDrives (); //получаем информацию о дисках
TV_InsertStruct.hInsertAfter = TVI_SORT; //тип вставки - в алфавитном порядке
TV_Item.mask = TVIF_TEXT; //информация содержится в полях pszText и cchTextMax
for (int i = 0; i< 26; i++) //26 возможных логических дисков
{
if ( dwDisks & FlagDisk[i].dwFlag )
{
SendMessage(hwndComboBox1, CB_ADDSTRING,
0, (LPARAM) FlagDisk[i].cDisk
);
SendMessage(hwndComboBox2, CB_ADDSTRING,
0, (LPARAM) FlagDisk[i].cDisk
);
}
}
}
//////////////////////////////
////////Процедуры для TreeView////////
//////////////////////////////
void CreateFoldersOnDisk(HWND hwnd)
{
TV_INSERTSTRUCT TV_
TV_ITEM TV_Item;
DWORD dwDisks; //
WIN32_FIND_DATA FileData; //
HANDLE FileHandle; //хэндл найденных файлов
char FileName[260]; //имя файла
SendMessage(hwndTreeView,TVM_
dwDisks = GetLogicalDrives (); //получаем информацию о дисках
TV_InsertStruct.hInsertAfter = TVI_SORT; //тип вставки - в алфавитном порядке
TV_Item.mask = TVIF_TEXT | TVIF_IMAGE; //информация содержится в полях pszText и cchTextMax
TV_InsertStruct.hParent = TVI_ROOT; //вставляем в корень
TV_Item.pszText = CurentDiskName; //название диска
TV_Item.cchTextMax = lstrlen(CurentDiskName);
TV_Item.iImage=(1);
TV_Item.iSelectedImage = (0);
TV_InsertStruct.item = TV_Item; //структура для вставки
TV_InsertStruct.hParent = TreeView_InsertItem(
char cCurrDir[4];
lstrcpy (cCurrDir, CurentDiskName);//создаём имя корневой директории
if ( !SetCurrentDirectory ( cCurrDir ) ) //устанавливаем текущий диск
{
MessageBox(hwnd, "Cannot set current directory!", "Error", MB_OK);
}
FileHandle = FindFirstFile ("*", &FileData); //ищем все файлы в текущей директории
if ( FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
lstrcpy(FileName, FileData.cFileName);
TV_Item.mask = TVIF_TEXT | TVIF_IMAGE; //информация содержится в полях pszText и cchTextMax
TV_Item.pszText = FileName; //текст для вставки
TV_Item.cchTextMax = lstrlen(FileName);
TV_Item.iImage=(1);
TV_Item.iSelectedImage = (0);
TV_InsertStruct.item = TV_Item; //структура для вставки
TreeView_InsertItem(
}
while ( FindNextFile(FileHandle, &FileData) ) //продолжаем поиск
{
if ( FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
lstrcpy(FileName, FileData.cFileName);
TV_Item.mask = TVIF_TEXT | TVIF_IMAGE; //информация содержится в полях pszText и cchTextMax
TV_Item.pszText = FileName; //текст для вставки
TV_Item.cchTextMax = lstrlen(FileName);
TV_Item.iImage=(1);
TV_Item.iSelectedImage = (0);
TV_InsertStruct.item = TV_Item; //структура для вставки
TreeView_InsertItem(
}
}
};
LPSTR FindFullPath (LPSTR strDrive, HWND hwndTreeView, HTREEITEM htreeItem)
{
char CurrText[200];
char ParentText[200];
TV_ITEM TV_Item;
TV_Item.mask = TVIF_HANDLE | TVIF_TEXT | TVIF_IMAGE;
TV_Item.hItem = htreeItem;
TV_Item.pszText = CurrText;
TV_Item.cchTextMax = 99;
TV_Item.iImage=(1);
TV_Item.iSelectedImage = (0);
TreeView_GetItem(hwndTreeView, &TV_Item);
for (int i = 0; i < 26; i++)
{
if ( lstrcmp (CurrText, FlagDisk[i].cDisk ) == 0 )
return CurrText;
}
char cTemp[200];
lstrcpyn (cTemp, CurrText, 2);
lstrcat (cTemp, '\0');
if (lstrcmp( cTemp, "\\") != 0 ) //если выбран файл, то добавляем слэш в начало
{
lstrcpy(cTemp, "\\");
lstrcat(cTemp, CurrText);
lstrcpy(CurrText, cTemp);
}
TV_Item.pszText = ParentText;
TV_Item.hItem = TreeView_GetParent(
TV_Item.iImage=(1);
TV_Item.iSelectedImage = (0);
TreeView_GetItem(hwndTreeView, &TV_Item);
lstrcat(FindFullPath(CurrText, hwndTreeView, TV_Item.hItem), CurrText);
}
bool AddChildren (HWND hwndTreeView, HTREEITEM hTreeItem, LPCSTR ParentDir )
{
char cCurrDir[1000]; //
char FileName[1000]; //имя файла
char tmpParentDir[1000];
WIN32_FIND_DATA FileData; /
HANDLE FileHandle; //хэнд
TV_INSERTSTRUCT TV_
TV_ITEM TV_Item; //
lstrcpy(tmpParentDir, ParentDir);
for (int i = 0; i < 26; i++)
{
if ( lstrcmp(tmpParentDir, FlagDisk[i].cDisk) == 0 )
{
lstrcat (tmpParentDir, "\\"); //создаём имя корневой директории
}
}
lstrcpy( cCurrDir, FindFullPath (tmpParentDir, hwndTreeView, hTreeItem) );
if ( !SetCurrentDirectory ( cCurrDir ) ) //устанавливаем текущую директорию
return false;
FileHandle = FindFirstFile ("*", &FileData); //ищем все файлы в текущей директории
if ( FileHandle == INVALID_HANDLE_VALUE ) //текущая директоря пустая
return true;
if ( FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) //если файл является директорией
{
lstrcpy(FileName, FileData.cFileName);
TV_InsertStruct.hInsertAfter = TVI_SORT; //тип вставки - в алфавитном порядке
TV_InsertStruct.hParent = hTreeItem; //элемент, который будет являться родителем вставляемых элементов
TV_Item.mask = TVIF_TEXT | TVIF_IMAGE; //информация содержится в полях pszText и cchTextMax
if ( (lstrcmp(FileName, ".") != 0) && (lstrcmp(FileName, "..") != 0))
{
TV_Item.pszText = FileName; //текст для вставки
TV_Item.cchTextMax = lstrlen(FileName);
TV_Item.iImage=(1);
TV_Item.iSelectedImage = (0);
TV_InsertStruct.item = TV_Item; //структура для вставки
TreeView_InsertItem(
}
}
while ( FindNextFile(FileHandle, &FileData) ) //продолжаем поиск
{
if ( FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) //если файл является директорией
{
lstrcpy(FileName, FileData.cFileName);
TV_InsertStruct.hInsertAfter = TVI_SORT; //тип вставки - в алфавитном порядке
TV_InsertStruct.hParent = hTreeItem; //элемент, который будет являться родителем вставляемых элементов
TV_Item.mask = TVIF_TEXT | TVIF_IMAGE; //информация содержится в полях pszText и cchTextMax
if ( lstrcmp(FileName, ".") != 0 && lstrcmp(FileName, "..") != 0)
{
TV_Item.pszText = FileName; //текст для вставки
TV_Item.cchTextMax = lstrlen(FileName);
TV_Item.iImage=(1);
TV_Item.iSelectedImage = (0);
TV_InsertStruct.item = TV_Item; //структура для вставки
TreeView_InsertItem(
}
}
}
FindClose (FileHandle);
return true;
}
bool DelChildren (HWND hwndTreeView, HTREEITEM hTreeItem)
{
HTREEITEM hItem;
hItem = TreeView_GetChild(
if ( !hItem && !hTreeItem) //нет потомков
return false;
while ( hItem ) //пока не удалим всех потомков
{
TreeView_DeleteItem(
hItem = TreeView_GetChild(
}
return true;
}
bool CollapseChildren(HWND hwndTreeView, HTREEITEM hTreeItem)
{
HTREEITEM hItem;
hItem = TreeView_GetChild(hwndTreeView
if ( hItem )
CollapseChildren(hwndTreeView, hItem);
TreeView_Expand(hwndTreeView, hItem, TVE_COLLAPSE );
hItem = TreeView_GetNextSibling(
if ( hItem )
CollapseChildren(hwndTreeView, hItem);
TreeView_Expand(hwndTreeView, hItem, TVE_COLLAPSE );
return true;
}
//////////////////////////////
/////////Процедуры для ListView//////////////////////
//////////////////////////////
void FillListView(HWND hwndlv, LPCSTR ParentDir, HIMAGELIST himlSmall)
{
WIN32_FIND_DATA FileData;
char DirName[1024];
SHFILEINFO fi;
HICON hIcon;
int count = ListView_GetItemCount(hwndlv);
for (int i = 0; i < count; i++)
{
LVITEM lvi;
lvi.mask = LVIF_PARAM;
lvi.iItem = i;
lvi.iSubItem = 0;
ListView_GetItem(hwndlv, &lvi);
delete (void*)lvi.lParam;
};
SendMessage(hwndlv,LVM_
SetCurrentDirectory(ParentDir)
ImageList_SetImageCount(
HANDLE hFile = FindFirstFile("*", &FileData);
LV_ITEM item;
int d=0;
DisActivate();
if (hFile != INVALID_HANDLE_VALUE)
{
SendMessage(hwndStatus, SB_SETTEXT, (WPARAM) 0, (LPARAM) "Scanning directory structure..." ); //отображаем в строке состояния процесс поиска
item.iItem = 0;
// Вставляем строки
char csText[256];
char csCopyText[256];
SYSTEMTIME stTime;
do
{
WIN32_FIND_DATA * pData = new WIN32_FIND_DATA;
*pData = FileData;
item.mask = LVIF_IMAGE | LVIF_TEXT | LVIF_PARAM;
if (strcmp(FileData.cFileName,"."
{
//////////////////item0///////
item.iSubItem = 0;
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
item.pszText = FileData.cFileName;
strcpy(DirName, ParentDir);
strcat(DirName, FileData.cFileName);
strcat(DirName,"\\");
if (GetFolderSize(DirName)<
{
item.iImage=a;
}
else
item.iImage=b;
SetCurrentDirectory(ParentDir)
}
else
{
SHGetFileInfo(FileData.
d = ImageList_AddIcon(himlSmall, fi.hIcon);
DestroyIcon(hIcon);
if (strrchr(FileData.cFileName,'.
{
strcpy(csCopyText,FileData.
strrchr(csCopyText,'.')[0]='\
item.pszText = csCopyText;
}
else
item.pszText = FileData.cFileName;
item.iImage=d;
}
item.lParam = (LPARAM)pData;
ListView_InsertItem(hwndlv, &item);
//////////////////item1///////
item.iSubItem = 1;
item.mask = LVIF_TEXT;
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
strcpy(csText,"<DIR>");
else
{
if(strchr(FileData.cFileName,'
{
strcpy(csText,"<?>");
}
else
strcpy(csText,strrchr(
}
item.pszText = (LPTSTR)(LPCTSTR)csText;
ListView_SetItem(hwndlv, &item);
//////////////////item2///////
item.iSubItem = 2;
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
strcpy(csText,"");
else
if (FileData.nFileSizeLow<1024)
wsprintf(csText,"%d b",FileData.nFileSizeLow);
else
wsprintf(csText,"%d Kb",FileData.nFileSizeLow/
item.pszText = (LPTSTR)(LPCTSTR)csText;
ListView_SetItem(hwndlv, &item);
//////////////////item3///////
item.iSubItem = 3;
FILETIME ft=FileData.ftLastWriteTime;
FileTimeToLocalFileTime(&ft,&
FileTimeToSystemTime(&ft,&
wsprintf(csText,
"%02d.%02d.%04d %02d:%02d",stTime.wDay,stTime.
stTime.wHour,stTime.wMinute);
item.pszText = (LPTSTR)(LPCTSTR)csText;
ListView_SetItem(hwndlv, &item);
item.iItem++;
}
if (lstrcmp(FileData.cFileName,".
{
item.iSubItem = 0;
item.iImage=c;