[Delphi] Курсовая работа. Создание файлового менеджера.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by brain, 27 Jul 2011.

  1. brain

    brain Elder - Старейшина

    Joined:
    4 Jul 2010
    Messages:
    249
    Likes Received:
    90
    Reputations:
    33
    [Delphi] Создание файлового менеджера.

    Введение

    В данной мини-статье я хотел бы расписать о том, как я писал Файловый менеджер для курсовой работы.
    Почему же я решил выложить свою работу? Ответ не совсем простой. Немного расскажу: когда мне была выданная тема курсовой работы ( файловый менеджер) я сразу же решил поискать готовый вариант в интернете, ну или хотя бы образец, все бы не чего, НО - я нашел всего 2 исходника, один из которых был собственно говоря 'от души' - все компоненты в исходной коде были переименованны под себя, и что ли бо понять в коде, где какой компонент - было не возможно. Так я понял, что придеться писать самому с нуля. Последнее время на форумах программистов появляются многочисленные вопросы о написании файлового менеджера, поэтому я расписываю свою курсовую работу, которая пригодится новичкам.
    Приступим. Разумеется есть множество недостатков и недоработок, но для изучения вполне хороший вариант. Судите сами.

    Техническое задание (ТЗ)​


    Разработать файловый менеджер, реализующий следующие функции:
    - Вывод списка файлов и каталогов;
    - Cоздание папок;
    - Возможность перемещения по каталогам;
    - Возможность выбора диска для работы;
    - Копирование, переименование и удаление файлов, и каталогов.
    Разработанное программное обеспечение должно функционировать под управлением операционной системы MS Windows XP и выше.


    Поэтапная реализация (выбор компонентов)


    Вывод списка файлов и каталогов​


    Для вывода списка файлов и директорий был выбран не столь простой компонент - ListView
    Я посчитал что он отлично подойдет, т.к в нем файлы можно отсортировывать по типу, дате, размеру. Но, все оказалось не так легко, я очень долго мучился с функцией вывода директорий в этот компонент. и вот что получилось.

    [​IMG]

    Вот такой не замысловатый вывод у нас получился. Посмотрим такой вывод на блок-схеме.
    Блок схема немного сокращенная ибо очень масштабная.


    [​IMG]

    Код функции вывода файлов в компонент 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


    [​IMG]

    Рассмотрим мини-блок-схему, что бы понять на сколько все просто:

    [​IMG]

    Исходный код:
    Code:
    begin
    Form2.Show;
    MkDir(Form2.Edit1.Text);
    Form2.Close;
    end;
    
    Как видите все элементарно. Идем дальше.

    Возможность перемещения по каталогам


    Конечно те, кто знаком или работали с компонентом ListView - сразу поняли, что хитрость выбор этого компонента состояла еще и в выгоде, как известно компонент уже наделен пострелочной навигацией. Поэтому на данном этапе мне запариваться не пришлось. Единственное что пришлось сделать это обработка нажатия на Enter для входа в поддериктории.

    Все видно на блок-схеме:

    [​IMG]

    Исходный код:
    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.
    Как видно на скриншоте мы можем выбрать раздел жетского диска для работы, что очень удобно.

    [​IMG]

    Рассмотрим блок-схему выбора диска для работы:

    [​IMG]

    Исходный код:
    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
    
    Копирование файлов и каталогов

    С копированием тоже оказалось не все так просто. Пришлось потратить время. :cool:
    Копирование происходит с вызовом InputBox'а.

    [​IMG]

    Рассмотрим функцию копирвоания на блок-схеме:

    [​IMG]

    Исходный код:
    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;
    
    Удаление файлов и каталогов​


    С удалением файлов все просто, особых проблем не было.

    [​IMG]

    Наша любимая блок-схема:

    [​IMG]

    Исходный код:

    Code:
    if Key = VK_F8 then
      begin
        MyDeleteFile(Curr_Dir, ListView1.Selected.Caption);
        DeleteDir(ListView1.Selected.Caption);
        LoadFileList(ListView1, Curr_Dir);
        end
    
    Дополнения/Доработки

    Так же я добавил в свой менеджер горячии клавиши, вывод текущего местонахождения в Edit.

    И так как же выглядит наш готовый вариант файлового менеджера?

    [​IMG]

    Вот такой вот у нас получился файловый менеджер.
    Выкладываю исходные коды. Думаю новичкам пригодятся. Вы сможете доработать его для себя, создать реализацию FTP-менеджера и кучу всего, чего душа пожелает. Все что я хотел до вас донести - я выполнил! Исходный код прокомментирован ( комментировал конечно для себя, но думаю разберется каждый). Отмечу что, в менеджере множество не доработок и багов. Но в образовательно-поучительных целях вполне хороший вариант.

    Скачать исходные коды




    Выслушаю вменяемую критику и замечания.

    brain, 2011
     
    #1 brain, 27 Jul 2011
    Last edited: 2 Aug 2011
    1 person likes this.
  2. brain

    brain Elder - Старейшина

    Joined:
    4 Jul 2010
    Messages:
    249
    Likes Received:
    90
    Reputations:
    33
    Принято.
    Но, запомни то, что Я - знаю, знаю только Я. ;)
    И, я думаю, лучше такое постить, чем создавать ебанутые и бесмысленные темы в болталке.
     
    #2 brain, 27 Jul 2011
    Last edited: 27 Jul 2011
  3. brain

    brain Elder - Старейшина

    Joined:
    4 Jul 2010
    Messages:
    249
    Likes Received:
    90
    Reputations:
    33
    Я предпочитаю учебно-методическую литературу.
     
  4. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Почему бы было не заюзать IShellFolder, чтобы получилось цивильно, как в проводнике винды, с иконками файлов и папок родными и меню...
    Хотя, конечно, ТЗ выполнено, а что еще надо.
     
  5. brain

    brain Elder - Старейшина

    Joined:
    4 Jul 2010
    Messages:
    249
    Likes Received:
    90
    Reputations:
    33
    Я делал через ListView т.к он хорошо повторяет Total commander.
     
    1 person likes this.
  6. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    При чем тут ListView, у тебя ListView бы никуда и не делся, в нем вывод и остался бы. IShellFolder - один из самых главных ком-интерфейсов винды, на базе которого можно построить проводник (получить списки объектов, их большие и маленькие иконки, стандартное меню проводника, копировать, удалять и перемещать файлы так, как это делает проводник винды и т.д.).
     
  7. brain

    brain Elder - Старейшина

    Joined:
    4 Jul 2010
    Messages:
    249
    Likes Received:
    90
    Reputations:
    33
    Я не знаком с IShellFolder. :confused: загуглю.
     
  8. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    FileListBox, DIrectoryListBox...