скачать рефераты
  RSS    

Меню

Быстрый поиск

скачать рефераты

скачать рефератыКурсовая работа: Файловый менеджер

 FileAndFolderOperation(frombuf,NULL,FO_DELETE);

 }

 }

 else

 if((ListView1->Selected)!=NULL)

 {

 char *frombuf;

 PrepareBufForOperationInListView(frombuf);

 FileAndFolderOperation(frombuf,NULL,FO_DELETE);

 }

 UpdateAll(false);

 }

void TForm1::ExpandTreeForFile(AnsiString FileName)

 { //Расширение ветвей tree до файла

 AnsiString Find="";

 TTreeNode *p=TreeView1->Items->Item[0], *child;

 child=p->getFirstChild();

 bool flag=false;

 do

 {

 flag=false;

 int pos=FileName.Pos("\\"); //Вычленение из имени файла папки

 Find=Find+FileName.SubString(1,pos); //прибавление к find

 FileName.Delete(1,pos);

 if(FileName.Pos("\\")==0)

 flag=true; //Критерий окончания

 child=p->getFirstChild();

 while(1)

 {

 if(child==NULL)

 {

 child=AddChildInNodeTree(p,Find); //Если узла вообще нет то создаем его

 if(!p->Expanded) //и расширяем его отца

 p->Expand(false);

 }

 if((*(AnsiString *)(child->Data)).AnsiCompareIC(Find)==0)

 {

 if (flag) //По окончании передаем выделение на этот узел

 TreeView1->Selected=child;

 else if(!child->Expanded) //если это толлько промежуточная папка

 child->Expand(false); //расширяем ветвь

 p=child;

 break;

 }

 child=p->GetNextChild(child);

 }

 }

 while(!flag);

 }

void TForm1::OpenFileOrFolder()

 { //Происходит открытие файла или папки выделенных в listview

 if(ListView1->Selected==NULL) return; //проверка наличия выделенного

 AnsiString ww=*((AnsiString *)(ListView1->Selected->Data));

 if((FileGetAttr(ww) & faDirectory)!=0) //В случае папки

 {

 ViewFailAndFolderInListView(ww); //Вызываем отображение папок и файлов

 ExpandTreeForFile(ww); //Расширяем treeview до этого файла

 }

 else

 {

 ShellExecute(NULL,"open",ww.c_str(),NULL,NULL,SW_RESTORE); //В случае файла

 if(GetLastError()) //Выполняем его и проверяем ошибки

 lpMsgBuf );

 }

 }

void RecursDelData(TTreeNode *node) //Рекурсивная функция обходит

 { // дочерние узлы и удаляет данные по указателю data

 delete node->Data;

 TTreeNode *child;

 for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child))

 RecursDelData(child);

 }

void TForm1::RecursTree(TTreeNode *node,bool UpdateAllways)

 {

 AnsiString dir=*((AnsiString *)(node->Data));

 TSearchRec sr;

 TTreeNode *child;

 int num=0;

 if(((GetDriveType(dir.c_str())==DRIVE_REMOVABLE) || (GetDriveType(dir.c_str())==DRIVE_CDROM)) && !DiskIn.Contains(ExtractFileDrive(dir)[1]))

 return; //Условие: просматривать дискету и диск если отмечено что они есть

 if(!UpdateAllways)

 {

 if(FindFirst(dir+"*",faAnyFile,sr)==0)

 do //и продолжить если найден файл

 if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!="..")

 num++; //Пересчитываем все папки в данной

 while(FindNext(sr)==0);

 FindClose(sr);

 }

 int count=node->Count;

 if(UpdateAllways || num!=count) //Сравниваем с количеством узлов потомков

 {

 if(UpdateAllways || num<count) //Если узлов потомков больше ищем отсутствующую папку

 for(child=node->getFirstChild();child!=NULL;)

 {

 AnsiString t=*(AnsiString *)(child->Data);

 if(GetFileAttributes(t.c_str())==-1)

 {

 TTreeNode *temp=node->GetNextChild(child);

 if(child->Selected) node->Selected=true;

 RecursDelData(child); //Удаляем данные несуществующей папки и ее потомков

 TreeView1->Items->Delete(child); //удаляем узел

 child=temp;

 }

 else

 child=node->GetNextChild(child);

 }

 if(UpdateAllways || num>count) //Если какой-то папки не хватает

 {

 if(FindFirst(dir+"*",faAnyFile,sr)==0) //Перебираем папки

 do

 if((sr.Attr & faDirectory) && sr.Name!="." && sr.Name!="..")

 { //Ищем для них узлы

 for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child))

 if((*(AnsiString *)(child->Data)).AnsiCompareIC((dir+sr.Name+"\\"))==0)

 break;

 if(child==NULL) //если соответствующего узла нет добавляем

 AddChildInNodeTree(node,dir+sr.Name+"\\");

 }

 while(FindNext(sr)==0);

 FindClose(sr);

 }

 }

 if(node->Expanded || CheckExpandedChild(node))

 {

 for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child))

 RecursTree(child,UpdateAllways);

 }

 }

void TForm1::UpdateTreeView(bool UpdateAllways) //Обновление treeview

 {

 TTreeNode *top=TreeView1->Items->Item[0];

 TTreeNode *child;

 if(top->Expanded)

 for(child=top->getFirstChild();child!=NULL;child=top->GetNextChild(child))

 RecursTree(child, UpdateAllways);

 TreeView1->AlphaSort();

 }

void TForm1::UpdateListView(bool UpdateAllways) //Обновление списка listview

 {

 if(CurrentDir=="") return; //Если ни один каталог не отображается

 if(GetFileAttributes(CurrentDir.c_str())==-1)

 { //Если текущего каталога уже не существует

 ViewFailAndFolderInListView(CurrentDir); //отображаем его ридительский каталог

 return;

 }

 TSearchRec sr;

 TListItem *item;

 int num=0; //подсчет количества файлов в папке

 if(!UpdateAllways)

 {

 if(FindFirst(CurrentDir+"*",faAnyFile,sr)==0)

 do //и продолжить если найден файл

 if(sr.Name!="." && sr.Name!="..")

 num++; //Пересчитываем все папки в данной

 while(FindNext(sr)==0);

 FindClose(sr);

 }

 int count=ListView1->Items->Count;

 if(UpdateAllways || num!=count) //Сравниваем с количеством узлов потомков

 {

 if(UpdateAllways || num<count) //Если записей больше чем файлов

 for(int i=0;i<ListView1->Items->Count;i++) //ищем уже отсутствующие в действительности

 {

 AnsiString t=*(AnsiString *)(ListView1->Items->Item[i]->Data);

 if(GetFileAttributes(t.c_str())==-1)

 {

 delete ListView1->Items->Item[i]->Data; //Удаляем вспомогательные данные для него

 ListView1->Items->Delete(i); //удаляем узел

 i--;

 }

 }

 if(UpdateAllways || num>count) //Если файлов не хватает

 {

 if(FindFirst(CurrentDir+"*",faAnyFile,sr)==0) //Перебираем файлы

 do

 if(sr.Name!="." && sr.Name!="..")

 { //Ищем для них записи

 int i;

 for(i=0;i<ListView1->Items->Count;i++)

 if((*(AnsiString *)(ListView1->Items->Item[i]->Data)).AnsiCompareIC(CurrentDir+sr.Name+((sr.Attr & faDirectory)?"\\":""))==0)

 break;

 if(i==ListView1->Items->Count) //если соответствующего узла нет добавляем

 AddItemInListView(sr,CurrentDir);

 }

 while(FindNext(sr)==0);

 FindClose(sr);

 }

 }

 }

void TForm1::UpdateLabel() //Обновление меток диска

 {

 TTreeNode *child, *node=TreeView1->Items->Item[0];

 for(child=node->getFirstChild();child!=NULL;child=node->GetNextChild(child))

 {

 AnsiString path=*((AnsiString *)child->Data);

 AnsiString text=child->Text;

 char inf[20];

 unsigned int p=GetDriveType(path.c_str());

 if(((p==DRIVE_REMOVABLE || p==DRIVE_CDROM) && (DiskIn.Contains(path[1]))) ||

 (p!=DRIVE_REMOVABLE && p!=DRIVE_CDROM))

 {

 if(GetVolumeInformation(path.c_str(),inf,20,NULL,NULL,NULL,NULL,NULL))

 {

 text.Delete(1,text.Pos("(")-1);

 FirstUpOtherDown(inf);

 child->Text=AnsiString(inf)+" "+text;

 }

 else

 {

 text.Delete(1,text.Pos("(")-1);

 child->Text=" "+text;

 ViewFailAndFolderInListView(path);

 }

 }

 else

 {

 text.Delete(1,text.Pos("(")-1);

 child->Text=" "+text;

 }

 }

 }

void TForm1::UpdateAll(bool UpdateAllways) //Обновление всего

 {

 UpdateTreeView(UpdateAllways); //Обновление дерева папок

 UpdateListView(UpdateAllways); //Обновление списка файлов

 UpdateLabel();

 double c=10.0;

 if(CurrentDir!="")

 {

 __int64 FreeSpace,TotalSpace;

 if(Sysutils::GetDiskFreeSpaceEx(ExtractFileDrive(CurrentDir).c_str(),NULL,TotalSpace,&FreeSpace))

 StatusBar1->SimpleText=AnsiString("Объектов: ")+ListView1->Items->Count+" (Свободно на диске "+ AnsiString(((FreeSpace*10)/1024/1024/1024)/c)+" ГБ)";

 }

 }

void TForm1::PasteFileFromClipboard() //Вставить из буфера

 {

 if(CurrentDir=="") return;

 char *frombuf, *temp;

 char tobuf[MAX_PATH+1]={'\0'};

 int nCount,i; //Число копируемых объектов

 Pointer Data;

 char * lpDroppedFile;

 OpenClipboard(NULL); //Открывает clipboard для текущего процесса

 if (IsClipboardFormatAvailable(CF_HDROP))

 {

 Data=GetClipboardData(CF_HDROP); //Получение указателя на данные

 if(Data==0) { CloseClipboard(); return; } //Нечего забирать

 nCount= DragQueryFile(Data, 0xFFFFFFFF, NULL, 0); //Получение количества

 temp=frombuf=new char[MAX_PATH*nCount];

 if (nCount > 0)

 {

 lpDroppedFile=(char *)AllocMem(MAX_PATH + 1); //Выделение памяти под массив

 for (i= 0;i<nCount;i++) //с названиями копирумых объектов

 {

 DragQueryFile(Data, i, lpDroppedFile, MAX_PATH); //Собственно получение имен этих объектов

 if(i!=0)

 strcat0(temp,lpDroppedFile); //Добавление к frombuf

 else

 strcpy(temp,lpDroppedFile);

 }

 finstr(temp);

 free(lpDroppedFile); //Освобождение

 strcpy(tobuf,CurrentDir.c_str());

 }

 long lngEffect;

 long lngFormat = RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);

 HANDLE hGlobal = GetClipboardData(lngFormat);

 if(hGlobal)

 MoveMemory(&lngEffect,hGlobal, 4);

 if((lngEffect & DROPEFFECT_COPY) == DROPEFFECT_COPY)

 FileAndFolderOperation(frombuf,tobuf , FO_COPY);

 if((lngEffect & DROPEFFECT_MOVE) == DROPEFFECT_MOVE)

 FileAndFolderOperation(frombuf,tobuf , FO_MOVE);

 UpdateAll(false);

 }

 CloseClipboard();

 }

void TForm1::CopyFileToClipboard(bool Copy)

 {

 if(CurrentDir=="") return;

 char *frombuf;

 unsigned int uDropEffect, uBufLen;

 DROPFILES dropFiles;

 unsigned int uGblLen,uDropFilesLen;

 HGLOBAL hGblFiles,hGblEffect;

 char *szData,*szFileList;

 DWORD *dwDropEffect;

 uDropEffect=RegisterClipboardFormat("Preferred DropEffect"); //Регистрация формата

 //для указания типа копирования

 hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));

 dwDropEffect=(DWORD*)GlobalLock(hGblEffect); //Выделение памяти под хранение

 if(Copy) //инфы о виде перемещения

 *dwDropEffect=DROPEFFECT_COPY; //Запись этой инфы

 else

 *dwDropEffect=DROPEFFECT_MOVE;

 GlobalUnlock(hGblEffect); //Разлочивание памяти

 uDropFilesLen=sizeof(DROPFILES); //Заполнение структуры содержащей инфу

 dropFiles.pFiles =uDropFilesLen; //о строке с именами перемещаемых файлов

 dropFiles.pt.x=0;

 dropFiles.pt.y=0;

 dropFiles.fNC =FALSE;

 dropFiles.fWide =FALSE;//TRUE;

 if(ListView1->ItemFocused==NULL)

 {

 if(TreeView1->Selected!=NULL) //Если в фокусе находится treeview

 if(TreeView1->Selected->Level>1)

 {

 AnsiString sourcestr=*((AnsiString *)(TreeView1->Selected->Data));

 sourcestr.SetLength(sourcestr.Length()-1);

 frombuf=new char[MAX_PATH+1];

 strcpy(frombuf,sourcestr.c_str());

 finstr(frombuf);

 }

 else

 return; //Выход в том случае если в фокусе Диск или Мой компьютер

 }

 else if((ListView1->Selected)!=NULL)

 PrepareBufForOperationInListView(frombuf);

 uBufLen=lengthfinstr(frombuf);

 uGblLen=uDropFilesLen+uBufLen+2;

 hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);

 szData=(char*)GlobalLock(hGblFiles);

 memcpy(szData,&dropFiles,uDropFilesLen);

 szFileList=szData+uDropFilesLen;

 memcpy(szFileList,frombuf,uBufLen);

 /*MultiByteToWideChar(CP_ACP,MB_COMPOSITE,

                            frombuf,uBufLen,(WCHAR *)szFileList,uBufLen*2+8);*/

 GlobalUnlock(hGblFiles);

 if( OpenClipboard(NULL) )

 {

 EmptyClipboard();

 SetClipboardData( CF_HDROP, hGblFiles );

 SetClipboardData(uDropEffect,hGblEffect);

 CloseClipboard();

 }

 }

void TForm1::CreateFol() //Создает папку в текущем каталоге

 {

 if(CurrentDir=="") return;

 AnsiString c="Новая папка",dir; //Производит поиск отсутствующей папки

 for(int i=1;(GetFileAttributes((dir=CurrentDir+c+i).c_str()))!=-1;i++);

 if(ListView1->Selected!=NULL) //Если есть выделенные узлы

 for(int i=0;i<ListView1->Items->Count;i++) //отменяем выделение

 ListView1->Items->Item[i]->Selected=false;

 if(CreateDir(dir)) //Создает ее

 {

 TSearchRec sr;

 FindFirst(dir,faDirectory,sr);

 TListItem *p=AddItemInListView(sr,ExtractFilePath(dir));

 ListView1->ItemFocused=p;

 p->Selected=true;

 p->EditCaption();

 }

 UpdateAll(false);

 }

//*************************************************************************

//------------------------------------------------------------------------

//***********************************************************************

__fastcall TForm1::TForm1(TComponent* Owner) //Конструктор формы

 : TForm(Owner)

{

 ShortDateFormat="dd/mm/yy";

 DateSeparator = '/';

 TimeSeparator=':';

 ShortTimeFormat="h:nn";

 AnsiString *a=new AnsiString("");

 TreeView1->Items->Item[0]->Data=a;

 head=TreeView1->Items->Item[0]; //Сохранение корня

 GetDrives(); //Загрузка дисков

 ShowDrives(); //Отображение в treview

 TreeView1->AlphaSort();

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TreeView1Expanding(TObject *Sender,

 TTreeNode *Node, bool &AllowExpansion)//Событие - открытие узла

{

 DragnDrop=false; //Запрещение перемещения

 TreeView1->Items->BeginUpdate();

 tpItem=TreeView1->TopItem; //Сохранение верхнего узла

 if(!CheckExpandedChild(Node)) //Если ни один из потомков не расширен

 ViewChild(Node);

 TreeView1->AlphaSort(); //Сортировка

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TreeView1Compare(TObject *Sender, TTreeNode *Node1,

 TTreeNode *Node2, int Data, int &Compare) //Функция сравнения

{

 if(Node1->Level==1) //Для упорядочивания treeview

 Compare=Node1->Text[Node1->Text.Length()-2]>Node1->Text[Node1->Text.Length()-2]?1:-1;

 else

 Compare=Node1->Text.AnsiCompare(Node2->Text);

}

//---------------------------------------------------------------------------

void __fastcall TForm1::TreeView1Expanded(TObject *Sender, TTreeNode *Node)

{ //Сообщение об окончании

 TTreeNode * temp=TreeView1->TopItem; //Раскрытия списка

 TreeView1->TopItem=tpItem; //Проверка выхода конца открытой ветви за экран

Страницы: 1, 2, 3, 4, 5


Новости

Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.