[Delphi] Создание файлового менеджера. Введение В данной мини-статье я хотел бы расписать о том, как я писал Файловый менеджер для курсовой работы. Почему же я решил выложить свою работу? Ответ не совсем простой. Немного расскажу: когда мне была выданная тема курсовой работы ( файловый менеджер) я сразу же решил поискать готовый вариант в интернете, ну или хотя бы образец, все бы не чего, НО - я нашел всего 2 исходника, один из которых был собственно говоря 'от души' - все компоненты в исходной коде были переименованны под себя, и что ли бо понять в коде, где какой компонент - было не возможно. Так я понял, что придеться писать самому с нуля. Последнее время на форумах программистов появляются многочисленные вопросы о написании файлового менеджера, поэтому я расписываю свою курсовую работу, которая пригодится новичкам. Приступим. Разумеется есть множество недостатков и недоработок, но для изучения вполне хороший вариант. Судите сами. Техническое задание (ТЗ) Разработать файловый менеджер, реализующий следующие функции: - Вывод списка файлов и каталогов; - Cоздание папок; - Возможность перемещения по каталогам; - Возможность выбора диска для работы; - Копирование, переименование и удаление файлов, и каталогов. Разработанное программное обеспечение должно функционировать под управлением операционной системы MS Windows XP и выше. Поэтапная реализация (выбор компонентов) Вывод списка файлов и каталогов Для вывода списка файлов и директорий был выбран не столь простой компонент - ListView Я посчитал что он отлично подойдет, т.к в нем файлы можно отсортировывать по типу, дате, размеру. Но, все оказалось не так легко, я очень долго мучился с функцией вывода директорий в этот компонент. и вот что получилось. Вот такой не замысловатый вывод у нас получился. Посмотрим такой вывод на блок-схеме. Блок схема немного сокращенная ибо очень масштабная. Код функции вывода файлов в компонент ListView: Code: procedure LoadFileList(var lv: TListView; const dir: String); var Handle: THandle; FindData: TWin32FindData; dDir: String; temp_ext: String; begin dDir := IncludeTrailingPathDelimiter(dir); SetCurrentDir(dDir); lv.Items.BeginUpdate; lv.Clear; Handle := FindFirstFile(PChar(dDir + '*'), FindData); if Handle <> INVALID_HANDLE_VALUE then try while FindNextFile(Handle, FindData) do begin with lv.Items.Add do begin Caption := ExtractFileName(FindData.cFileName); temp_ext := ExtractFileExt(FindData.cFileName); if (FindData.dwFileAttributes and faDirectory) = faDirectory then SubItems.Add('[Папка]') else SubItems.Add(Copy(temp_ext, 2, Length(temp_ext) - 1)); SubItems.Add(FloatToStrF(FindData.nFileSizeHigh*4294967296 + FindData.nFileSizeLow, ffNumber, 18, 0)); end; end; finally Windows.FindClose(Handle); lv.Items.EndUpdate; end; end; Так с выводом думаю разобрались. (все можно сделать на много лучше и интересней) Переходим к следующему понкту нашего ТЗ. Cоздание папок(директорий) Создание новой папки я решил сделать через вторую - вызываемую форму - она же Form2. Сама процедура создания новой директории черезвычайно проста, и имеется в каждой учебники Delphi. Создавать новую директори или папку, мы будем через функцию MkDir Рассмотрим мини-блок-схему, что бы понять на сколько все просто: Исходный код: Code: begin Form2.Show; MkDir(Form2.Edit1.Text); Form2.Close; end; Как видите все элементарно. Идем дальше. Возможность перемещения по каталогам Конечно те, кто знаком или работали с компонентом ListView - сразу поняли, что хитрость выбор этого компонента состояла еще и в выгоде, как известно компонент уже наделен пострелочной навигацией. Поэтому на данном этапе мне запариваться не пришлось. Единственное что пришлось сделать это обработка нажатия на Enter для входа в поддериктории. Все видно на блок-схеме: Исходный код: Code: procedure TForm1.ListView1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (Key = 13) and (ListView1.Selected <> nil) then // нажатие на Enter begin Curr_Dir := Curr_Dir + '\' + ListView1.Selected.Caption + '\'; LoadFileList(ListView1, Curr_Dir); Edit1.Text:=Curr_Dir; // путь end; Возможность выбора диска для работы Для данной реализации мне понадобился старенький компонент - DriveComboBox. Как видно на скриншоте мы можем выбрать раздел жетского диска для работы, что очень удобно. Рассмотрим блок-схему выбора диска для работы: Исходный код: Code: procedure TForm1.DriveComboBox1Change(Sender: TObject); begin LoadFileList(ListView1,DriveComboBox1.drive+':'); // загружаем Curr_Dir:=DriveComboBox1.Drive+':'; // уст. тек. дерикторию ListView1.SetFocus; // выделение первого итема в ListView1 if ListView1.Items.Count <> 0 then ListView1.ItemIndex := 0; Edit1.Text:=DriveComboBox1.Drive+':' + '\'; // выставляем птусть в едит1 end Копирование файлов и каталогов С копированием тоже оказалось не все так просто. Пришлось потратить время. Копирование происходит с вызовом InputBox'а. Рассмотрим функцию копирвоания на блок-схеме: Исходный код: Code: if Key = VK_F5 then begin SetCurrentDir(r_S); r_S := Edit1.Text; r_S2:= Edit2.Text; AssignFile(FromF, r_S+ListView1.Selected.Caption); Reset(FromF, 1); InputString:= InputBox('Копируем', 'Куда копируем?', r_S2+ListView2.Selected.Caption+'\'); AssignFile(ToF, InputString+ListView1.Selected.Caption); Rewrite(ToF, 1); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten <> NumRead); CloseFile(FromF); CloseFile(ToF); end; Удаление файлов и каталогов С удалением файлов все просто, особых проблем не было. Наша любимая блок-схема: Исходный код: Code: if Key = VK_F8 then begin MyDeleteFile(Curr_Dir, ListView1.Selected.Caption); DeleteDir(ListView1.Selected.Caption); LoadFileList(ListView1, Curr_Dir); end Дополнения/Доработки Так же я добавил в свой менеджер горячии клавиши, вывод текущего местонахождения в Edit. И так как же выглядит наш готовый вариант файлового менеджера? Вот такой вот у нас получился файловый менеджер. Выкладываю исходные коды. Думаю новичкам пригодятся. Вы сможете доработать его для себя, создать реализацию FTP-менеджера и кучу всего, чего душа пожелает. Все что я хотел до вас донести - я выполнил! Исходный код прокомментирован ( комментировал конечно для себя, но думаю разберется каждый). Отмечу что, в менеджере множество не доработок и багов. Но в образовательно-поучительных целях вполне хороший вариант. Скачать исходные коды RgHost.ru DepositFiles.com Выслушаю вменяемую критику и замечания. brain, 2011
Принято. Но, запомни то, что Я - знаю, знаю только Я. И, я думаю, лучше такое постить, чем создавать ебанутые и бесмысленные темы в болталке.
Почему бы было не заюзать IShellFolder, чтобы получилось цивильно, как в проводнике винды, с иконками файлов и папок родными и меню... Хотя, конечно, ТЗ выполнено, а что еще надо.
При чем тут ListView, у тебя ListView бы никуда и не делся, в нем вывод и остался бы. IShellFolder - один из самых главных ком-интерфейсов винды, на базе которого можно построить проводник (получить списки объектов, их большие и маленькие иконки, стандартное меню проводника, копировать, удалять и перемещать файлы так, как это делает проводник винды и т.д.).