Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Простейший файловый менеджер на MFC


Автор: Sputnick 9.5.2010, 19:30
Всем привет!!!
Народ помогите, задали в универе сделать простейший файловый менеджер на MFC, достаточно будет только навигация по файловой системе. Вообще пишу на шарпе, вкусил MFC и ошизел ((((

появилось несколько вопросов:

1) через раз при билде вылазит ошибка - Error 1 fatal error LNK1000: Internal error during IncrBuildImage FileMan FileMan
тупо запускаешь еще раз на выполнение и запускается, че это за фигня??

2) получаю список дисков так:

Код

TCHAR buf[100];
DWORD len = GetLogicalDriveStrings(sizeof(buf)/sizeof(TCHAR),buf);
for(TCHAR*p=buf;*p!=0;p+=4)
{
m_combo.AddString(p);
}
m_combo.SetWindowText( _T("C:\\") );


идее сканирование диска надо вешать на OnCbnEditchangeComboDisks но на нем не работает, пробовал OnCbnCloseupComboDisks и OnCbnSelchangeComboDisks на них сканирует, но если 2 раза выбрать диск.
если тип комбобокса выбрать DropList то подписавшись на событие OnCbnSelchangeComboDisks все работает, но DropList не подходит, так как надо чтоб выбранный диск отображался на ComboDisks. (((((

3) Просто просканировать диск и заполнить папками триивью получается, а мне нужно еще проверить нет ли в папке подпапки и если есть, создать фиктивный узел в триивью, делаю так:

Код

//СКАНИРОВАНИЕ ДИСКА
CFileFind m_finder; 

CString szFavorite_path("C:\\"),
RootPath ("C:\\"); 

BOOL bWorking,
bWorkingSub;

DWORD dwAttr = GetFileAttributes(szFavorite_path); 

if(dwAttr == 0xffffffff) 
{ 
DWORD dwError = GetLastError(); 

if(dwError == ERROR_FILE_NOT_FOUND) 
{ 
//MessageBox("Not Found", "Error", MB_OK); 
} 
} 
else 
{ 
bWorking = m_finder.FindFile(szFavorite_path += "*.*"); 

while (bWorking) 
{ 
bWorking = m_finder.FindNextFile(); 

if (m_finder.IsDirectory()) //! && //каталоги нам надо тоже !m_finder.IsDots()
{ 
CString m_FileName = m_finder.GetFileName(); 

//ПРОВЕРИМ ИМЕЕТ ЛИ ТЕКУЩИЙ КАТАЛОГ ПОДКАТАЛОГ
bWorkingSub = m_finder.FindFile(RootPath += m_FileName += "\\*.*");
if (m_finder.IsDirectory())//если у текущего каталога есть подкаталог, добавим фиктивный подузел, чтобы каталог был с //плюсом (признак того что есть подкаталог)
{ 
CString fikt(TEXT("fikt"));
HTREEITEM h1 = m_treeFileIO.InsertItem(m_FileName);
HTREEITEM h2 = m_treeFileIO.InsertItem(fikt, h1);

}
else //если текущий каталог не имеет подкаталога, идем дальше
{
m_treeFileIO.InsertItem(m_FileName);
}


}
}



вроде все правильно, но при выполнении вылазит эта ошибка:
debug assertion faild line 369
у меня в файле всего 250 строк, че за бред ((((((
Коллеги помогите пж.

Автор: NightmareZ 9.5.2010, 23:37
Цитата(Sputnick @  9.5.2010,  19:30 Найти цитируемый пост)
Народ помогите, задали в универе сделать простейший файловый менеджер на MFC


К чему такие ограничения? Нельзя с преподом договориться и написать его на чём-нить более свежем?

Автор: Sputnick 10.5.2010, 05:58
Цитата(NightmareZ @ 9.5.2010,  23:37)
Цитата(Sputnick @  9.5.2010,  19:30 Найти цитируемый пост)
Народ помогите, задали в универе сделать простейший файловый менеджер на MFC


К чему такие ограничения? Нельзя с преподом договориться и написать его на чём-нить более свежем?

та это долг который припомнили перед дипломом ((((

Автор: Sputnick 10.5.2010, 07:15
с утра посидел, данный этап получился:

Код

//СКАНИРОВАНИЕ ДИСКА
CFileFind  m_finder; 

CString    szFavorite_path("C:\\"),
           RootPath ("C:\\"); 

BOOL       bWorking;
           
     
DWORD dwAttr = GetFileAttributes(szFavorite_path);  
  
    if(dwAttr ==    0xffffffff)  
    {  
        DWORD dwError = GetLastError();  
  
        if(dwError == ERROR_FILE_NOT_FOUND)  
        {  
            MessageBox(CString("Not Found"), CString("Error"), MB_OK);  
        }  
    }      
    else  
    {  
     bWorking = m_finder.FindFile(szFavorite_path += "*.*");  
        
    while  (bWorking)  
    {        
        bWorking = m_finder.FindNextFile();  
  
        if (m_finder.IsDirectory()) //! && //каталоги нам надо тоже !m_finder.IsDots()
        {  
            CString m_FileName = m_finder.GetFileName(); 

            //ПРОВЕРИМ ИМЕЕТ ЛИ ТЕКУЩИЙ КАТАЛОГ ПОДКАТАЛОГ
            CFileFind  m_Subfinder;
            CString m_FileNameSub;
            BOOL bWorkingSub;

            m_FileNameSub+= m_FileName + CString("\\*.*");            
            bWorkingSub = m_Subfinder.FindFile(RootPath + m_FileNameSub);
            MessageBox(RootPath, CString("Error"), MB_OK); 
            while  (bWorkingSub)  
                {        
                    bWorkingSub = m_Subfinder.FindNextFile();

                 if (m_Subfinder.IsDirectory())//если у текущего каталога есть подкаталог, добавим фиктивный подузел, чтобы каталог был с плюсом (признак того что есть подкаталог)
                   {                    
                    CString fikt(TEXT("fikt"));
                    HTREEITEM h1 = m_treeFileIO.InsertItem(m_FileName);
                    HTREEITEM h2 = m_treeFileIO.InsertItem(fikt, h1);
                    goto next;
                   }
                   else //если текущий каталог не имеет подкаталога, идем дальше
                   {
                    
                    goto AddAndNext;
                   }
                    
                }//while  (bWorkingSub)

        AddAndNext:;
        m_treeFileIO.InsertItem(m_FileName);
        next:;
        }//if

    } //while

  } //else

Автор: Sputnick 10.5.2010, 20:47
народ хелп, никак не могу догнать как седлать следующее:
мой тривью инициирован корневыми папками, если в папке есть подпапка, я создаю фиктивную папку, чтоб корневая папка была с плюсом (чтоб визуально было понятно, что папка содержит подпапку).

Далее мне необходимо при разворачивании узла (нажатии на плюс) сканировать папку которую разворачиваем, вот тут затык, я не могу понять как заполнять найденными папками именно папку которую разворачиваю, как то ее индекс вычислять, или как????

Автор: voov 11.5.2010, 11:05
CTreeCtrl::GetSelectedItem()
CTreeCtrl::GetItemText()

можно еще ImageList к дереву прикрутить, чтобы лучше папки от файлов отличать

Автор: Sputnick 12.5.2010, 09:49
Цитата(voov @ 11.5.2010,  11:05)
CTreeCtrl::GetSelectedItem()
CTreeCtrl::GetItemText()

можно еще ImageList к дереву прикрутить, чтобы лучше папки от файлов отличать

да, картинками позже займусь, сначало самое сложное сделаю.

такс и с этим разобрались, подсказали, в жизнь бы не догадался:

Код

void CFileManDlg::OnTvnItemexpandedTree(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
    // TODO: Add your control notification handler code here


 //при разворачивании узла сканируем разворачиваемую папку и добавляем дочерние узлы

if (TVE_EXPAND == pNMTreeView->action) //если разворачиваем
{
m_treeFileIO.SelectItem(pNMTreeView->itemNew.hItem);

//получим имя  папки по которой кликнули
HTREEITEM ht = m_treeFileIO.GetSelectedItem();
CString SelectedFolders = m_treeFileIO.GetItemText(ht);

//удалим фиктивный итем с разварачиваемой папки, который создали ранее
if (m_treeFileIO.ItemHasChildren(pNMTreeView->itemNew.hItem) )
{
HTREEITEM hNextItem;
HTREEITEM hChildItem = m_treeFileIO.GetChildItem(pNMTreeView->itemNew.hItem); 

   while (hChildItem != NULL)
   {
      hNextItem = m_treeFileIO.GetNextItem(hChildItem, TVGN_NEXT);
      m_treeFileIO.DeleteItem(hChildItem);
      hChildItem = hNextItem;
  }
}



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

мне надо сканировать диск и добавлять папки в тривью, если есть подпапка, то делать в ней фиктивный узел (чтоб плюсик появлялся)


Код


//СКАНИРОВАНИЕ ДИСКА
m_treeFileIO.DeleteAllItems() ;//очищаем тривью

CFileFind          m_finder;

CString      szFavorite_path, RootPath; 
m_combo.GetWindowTextW(szFavorite_path);
m_combo.GetWindowTextW(RootPath);

BOOL       bWorking;           
     

    bWorking = m_finder.FindFile(szFavorite_path += "*.*");  
        
    while  (bWorking)  
    {        
        bWorking = m_finder.FindNextFile();
        //if (m_finder.IsDots())
        //continue;
  
        if (m_finder.IsDirectory() &&!m_finder.IsDots() ) //! && //каталоги нам надо тоже !m_finder.IsDots()
        {  
            CString m_FileName = m_finder.GetFileName(); 

            //ПРОВЕРИМ ИМЕЕТ ЛИ ТЕКУЩИЙ КАТАЛОГ ПОДКАТАЛОГ
            CFileFind  m_Subfinder;
            CString m_FileNameSub;
            BOOL bWorkingSub;

            m_FileNameSub+= RootPath + m_FileName + CString("\\*.*");            
            bWorkingSub = m_Subfinder.FindFile(m_FileNameSub);
            //MessageBox(RootPath, CString("Error"), MB_OK); 
            while  (bWorkingSub)  
                {        
                    bWorkingSub = m_Subfinder.FindNextFile();
                    if (m_Subfinder.IsDots())
                    continue;

                 if (m_Subfinder.IsDirectory() &&!m_Subfinder.IsDots() )//если у текущего каталога есть подкаталог, добавим фиктивный подузел, чтобы каталог был с плюсом (признак того что есть подкаталог)
                   {
                    //MessageBox(m_FileNameSub, CString("Error"), MB_OK); 
                    CString fikt(TEXT("fikt"));
                    HTREEITEM h1 = m_treeFileIO.InsertItem(m_FileName);
                    HTREEITEM h2 = m_treeFileIO.InsertItem(fikt, h1);
                    goto next;//перепрыгываем через добавление каталога, ибо все сделали тут
                   }
                   else //если текущий каталог не имеет подкаталога, идем дальше
                   {
                    
                    goto AddAndNext;//если подкаталога нет то добавляем корневой каталог и двигаемся дальше
                   }
                    
                }//while  (bWorkingSub)

        AddAndNext:;
        m_treeFileIO.InsertItem(m_FileName);
        next:;
        }//if

    } //while


косяк такой что плюсы к папкам добавляются в совершенно хаотичном порядке, и правильно - там где есть подпапка - ставиться плюсик. и не правильно - там где есть подпапки, плюсик не ставится(((((((

Автор: Sputnick 12.5.2010, 10:24
ура, понял, перемудрил с goto
не до конца просматривал подпапку))

Добавлено через 8 минут и 31 секунду
Цитата(voov @ 11.5.2010,  11:05)
CTreeCtrl::GetSelectedItem()
CTreeCtrl::GetItemText()

можно еще ImageList к дереву прикрутить, чтобы лучше папки от файлов отличать

хм, у меня на панели инструментов нет ImageList
вероятно из-за того что проект выбран - диалоговое приложение...
а как же его добавить? ((

Автор: voov 13.5.2010, 10:31
http://forum.vingrad.ru/forum/topic-99841/hl/imagelist/index.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)