Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простейший файловый менеджер на MFC 
:(
    Опции темы
Sputnick
Дата 9.5.2010, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.5.2008

Репутация: нет
Всего: нет



Всем привет!!!
Народ помогите, задали в универе сделать простейший файловый менеджер на 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 строк, че за бред ((((((
Коллеги помогите пж.
PM MAIL   Вверх
NightmareZ
Дата 9.5.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


[хакер]
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 10.8.2006

Репутация: нет
Всего: 13



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


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


--------------------
NightmareZ.net - мой блог и сайт, мои проекты и прочий трэш
Ely-Art.ru - наша маленькая домашняя арт-студия
mugcraft.ru - кружки на любой вкус
PM WWW ICQ Skype GTalk AOL YIM   Вверх
Sputnick
Дата 10.5.2010, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.5.2008

Репутация: нет
Всего: нет



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


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

та это долг который припомнили перед дипломом ((((
PM MAIL   Вверх
Sputnick
Дата 10.5.2010, 07:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.5.2008

Репутация: нет
Всего: нет



с утра посидел, данный этап получился:

Код

//СКАНИРОВАНИЕ ДИСКА
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

PM MAIL   Вверх
Sputnick
Дата 10.5.2010, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.5.2008

Репутация: нет
Всего: нет



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

Далее мне необходимо при разворачивании узла (нажатии на плюс) сканировать папку которую разворачиваем, вот тут затык, я не могу понять как заполнять найденными папками именно папку которую разворачиваю, как то ее индекс вычислять, или как????
PM MAIL   Вверх
voov
Дата 11.5.2010, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



CTreeCtrl::GetSelectedItem()
CTreeCtrl::GetItemText()

можно еще ImageList к дереву прикрутить, чтобы лучше папки от файлов отличать
PM MAIL   Вверх
Sputnick
Дата 12.5.2010, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.5.2008

Репутация: нет
Всего: нет



Цитата(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


косяк такой что плюсы к папкам добавляются в совершенно хаотичном порядке, и правильно - там где есть подпапка - ставиться плюсик. и не правильно - там где есть подпапки, плюсик не ставится(((((((
PM MAIL   Вверх
Sputnick
Дата 12.5.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 12.5.2008

Репутация: нет
Всего: нет



ура, понял, перемудрил с goto
не до конца просматривал подпапку))

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

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

хм, у меня на панели инструментов нет ImageList
вероятно из-за того что проект выбран - диалоговое приложение...
а как же его добавить? ((
PM MAIL   Вверх
voov
Дата 13.5.2010, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 29.11.2007

Репутация: 8
Всего: 8



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0789 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.