2008-12-08 9 views
1

Y at-il un équivalent à la méthode du fichier Java isDirectory() dans MFC? J'ai essayé d'utiliser ceci:MFC équivalent au fichier Java # isDirectory()


static bool isDirectory(CString &path) { 
    return GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY; 
} 

mais cela ne semble pas fonctionner.

Répondre

2

Désolé pour éventuellement « incompatibilité » de réponse à la question, mais peut-être vous verrez utile parce que chaque fois que je besoin de quelque chose comme ça dans Windows je ne suis pas en utilisant MFC mais API Windows standard:

//not completely tested but after some debug I'm sure it'll work 
bool IsDirectory(LPCTSTR sDirName) 
{ 
    //First define special structure defined in windows 
    WIN32_FIND_DATA findFileData; ZeroMemory(&findFileData, sizeof(WIN32_FIND_DATA)); 
    //after that call WinAPI function finding file\directory 
    //(don't forget to close handle after all!) 
    HANDLE hf = ::FindFirstFile(sDirName, &findFileData); 
    if (hf == INVALID_HANDLE_VALUE) //also predefined value - 0xFFFFFFFF 
    return false; 
    //closing handle! 
    ::FindClose(hf); 
    // true if directory flag in on 
    return (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; 
} 
+0

J'aime votre réponse! Merci ! – Geo

4

CFileFind :: isdirectory()

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

EDIT:

#include <afxwin.h> 
    #include <iostream> 

    using namespace std; 

    CFileFind finder; 

    fileName += _T("c:\\aDirName"); 
    if (finder.FindFile(fileName)) 
    { 
     if (finder.FindNextFIle()) 
     {    
       if (finder.IsDirectory()) 
       { 
        // Do directory stuff... 
       } 
     } 
    } 

Si vous changez le nom de fichier pour avoir des jokers, vous pouvez faire un

while(finder.findNextFile()) {... 

pour obtenir tous fichiers correspondants.

+0

Pouvez-vous s'il vous plaît poster un extrait avec son utilisation? Le code posté par microsoft ne m'aide pas avec ce que j'essaye d'accomplir. – Geo

+0

Dites-moi, pourquoi envoyez-vous un fichier .txt comme argument, puis recherchez d'autres fichiers? Corrigez-moi si je me trompe, mais si je n'envoie pas de caractère générique à l'objet, pourquoi continuera-t-il à rechercher des fichiers? – Geo

+0

FindFileName() ne trouve pas réellement le premier fichier. Cela renvoie juste une erreur si le fichier glob n'est pas trouvé. FindNextFile() va récupérer le fichier/répertoire. Regardez le code MS, voir que findNextFile() est appelé avant d'opérer sur le fichier lui-même. C'est un modèle très commun dans MFC. –

1

MFC solution comme demandé: a_FSItem chemin de l'élément à tester (examiner le CFile :: GetStatus() pour les exigences nécessaires).

CFileStatus t_aFSItemStat; 
    CFile::GetStatus(a_FSItem, t_aFSItemStat); 

    if ((t_aFSItemStat.m_attribute & CFile::directory) 
    return true; 

    return false; 

si vous souhaitez inclure une racine de volume comme un répertoire valide suffit d'ajouter à l'épreuve

t_aFSItemStat.m_attribute & CFile::volume 
1

Ce ne est pas MFC, mais j'utiliser ceci:

bool IsValidFolder(LPCTSTR pszPath) 
{ 
    const DWORD dwAttr = ::GetFileAttributes(pszPath); 
    if(dwAttr != 0xFFFFFFFF) 
    { 
     if((FILE_ATTRIBUTE_DIRECTORY & dwAttr) && 
      0 != _tcscmp(_T("."), pszPath) && 
      0 != _tcscmp(_T(".."), pszPath)) 
     { 
      return true; 
     } 
    } 

    return false; 
}