如何区分 MFC(VC++)中的文件夹类型(Windows/FTP)?

Posted

技术标签:

【中文标题】如何区分 MFC(VC++)中的文件夹类型(Windows/FTP)?【英文标题】:how to differentiate a Folder Type(Windows/FTP) in MFC(VC++)? 【发布时间】:2010-11-24 04:09:49 【问题描述】:

如何区分 MFC(VC++) 中的文件夹类型(Windows/FTP)? 在我的情况下,我有一个 MFC 树视图,我在其中添加来自服务器的文件夹列表,这些文件夹是 Windows 和 CIFS。现在我想在内部区分它们是什么类型的文件夹,因为我选择了一些文件夹并说连接然后它带来向上登录页面,我需要登录凭据详细信息,但在此之前我需要区分那是什么类型的文件夹?

任何树视图属性,如设置和geeting 键或任何其他方法。 提前致谢。

我以这种格式从服务器获取文件夹列表 volume1/Folder1,volume2/Folder2||Folder3,Folder4 在下面的方法中我正在删除“||”并将它们维护在两个不同的变量中:strDataFolder 包含 - FTP 文件夹和 strNASfolders 包含 CIFS 文件夹,然后是我使用 UpdateFolder 的另一种方法。如果是 FTP,则直接添加,但如果是 CIFS 检查重复,如果该文件夹已经存在,则不要再次将其添加到树视图。

现在我不知道如何区分它们是什么类型的文件夹?

void CNDSClientDlg::UpdateSharedFolder(CString strNASfolders,HTREEITEM hChildItem)

    CString strDataFolder = "";
    CString strData = "";       

    int iPos = 0;
    int fPosition = 0;

    fPosition = strNASfolders.Find("||");           
    if(fPosition != -1)
    
        strDataFolder = strNASfolders.Mid(0,fPosition);
        strNASfolders = strNASfolders.Right(strNASfolders.GetLength()-(fPosition+2));   

    
    else
    
       strDataFolder = strNASfolders;
    

    if (strDataFolder != "" )
    
         UpdateFolders(strDataFolder,hChildItem,false);

    
    if (strNASfolders != "" )        //don't add if already exist
    
        UpdateFolders(strNASfolders,hChildItem,true);
    

void CNDSClientDlg::UpdateFolders(CString strFolderType,HTREEITEM hChildItem,bool bCheck)

        int iPos = 0 ;      
        CString strData = "";
        CString strCurrFolder ="";
        HTREEITEM HShareFolder = NULL;
        bool bFound = false ;
        while (iPos != -1)
        
            iPos = strFolderType.Find(","); 



        if (iPos != -1)
                       
             strData = strFolderType.Mid(0,iPos);//get the folder details
        
        else
        
            strData = strFolderType;//get the last folder details
        

        strFolderType = strFolderType.Right(strFolderType.GetLength()-(iPos+1)); //get remaining data
        int fPos = strData.ReverseFind('/');
        if (fPos != -1)
        
            strCurrFolder = strData.Mid(fPos+1,strData.GetLength());    // get required data                                

        
        else
        
            strCurrFolder = strData; //else assign all the data 
        

         if(bCheck == true)
         
            bFound = false ;
            HTREEITEM hTempItem = NULL;
            CString strItemText = "" ;
            hTempItem = m_pTreeview->GetChildItem(hChildItem);
            strItemText = m_pTreeview->GetItemText(hTempItem);
            while(hTempItem != NULL)
            
                if(strItemText != strCurrFolder) 
                
                    strItemText = m_pTreeview->GetItemText(hTempItem);
                    hTempItem = m_pTreeview->GetNextSiblingItem(hTempItem);
                
                else
                
                    bFound = true;
                    break;
                
            


         
        if(bCheck == false || bFound == false)
         

                HShareFolder = m_pTreeview->InsertItem(strCurrFolder,hChildItem);                   
                m_pTreeview->SetItemImage(HShareFolder,2,2);
                TTipItemData* pToolTipData ; 
                pToolTipData  = new TTipItemData; 
                pToolTipData->strTool = strData ;                                                                
                m_pTreeview->SetItemData(HShareFolder,DWORD(pToolTipData));

            

         m_pTreeview->Expand(hParentItem,TVE_EXPAND);
         m_pTreeview->EnsureVisible(hParentItem);



    

【问题讨论】:

【参考方案1】:

树视图中的项目可以有与之关联的任意数据。签出:

http://msdn.microsoft.com/en-us/library/ettyybhw(VS.80).aspx

此处显示的 InsertItem 方法有一个 LPARAM 参数。这是供您使用的,您可以将其设置为对您的应用程序有意义的某个值。

(编辑:或者,使用最不复杂的重载之一来插入您的项目并在之后返回的句柄上使用 CTreeCtrl::SetItemData)。

要了解与您的商品相关的价值,请使用CTreeCtrl::GetItemData

小例子:

HTREEITEM hItem = m_ctrlTree.InsertItem("My Item", TVI_ROOT);
HTREEITEM hOther = m_ctrlTree.InsertItem("Child Item", hItem);
m_ctrlTree.SetItemData(hItem, static_cast<DWORD_PTR>(10)); // set LPARAM to 10

// note, you can also store pointers!  This assumes pObj is some kind of instance
// of a class.
m_ctrlTree.SetItemData(hOther, static_cast<DWORD_PTR>(pObj));


// at a later point:
int myVal = static_cast<int>(m_ctrlTree.GetItemData(hItem));
MyObject* pObj = static_cast<MyObject*>(m_ctrlTree.GetItemData(hOther));

【讨论】:

CTreeCtrl::SetItemData 插入项目后的工作方式相同。 @djeidot +1。实际上,这种方式比在大型结构中撒尿更容易。 你能给我一些关于 lparam 如何使用它的例子吗? @Moo-juice:我看到了你的小例子,但不明白如何在我的场景中使用。

以上是关于如何区分 MFC(VC++)中的文件夹类型(Windows/FTP)?的主要内容,如果未能解决你的问题,请参考以下文章

Win32控制台应用程序怎样使用MFC中的CFile类?

无法理解普通 c++ 与 vc++、win32 编程、mfc、win32 api、CLI 之间的关系 [关闭]

VC++中的MFC应用

VC++如何将rc资源中的图片加载到MFC的CImage对象中(附源码)

vc,mfc,api,windows编程,win32(sdk),gui学习的顺序是怎样的,本人迷茫中!!

如何在单击按钮时暂停读取文本文件并在 mfc vc++ 中的单击按钮时恢复它?