据说NTFS文件系统有一个文件列表区保存了所有文件的信息,我想访问它。主要获取文件名,文件路径,文件的图标。求帮助

解决方案 »

  1.   

    文件系统没有保存那些东西 API也是根据PE信息获取的 而文件系统只是提供一种存储管理方式
      

  2.   

    你想读取日志文件 有两种方法 
    1 通过ReadFile(PHYSICALDRIVE)来手动定位MFT记录
    2 通过DeviceIoControl(FSCTL_GET_NTFS_FILE_RECORD)得到MFT记录最后还是要你自己解析
      

  3.   


    能说一下DeviceIoControl我只找到在VB中的声明,英文有看不懂!
    它是windows API函数吗?
      

  4.   

    10几分钟算法问题吧
    我手动解析NTFS 8w个文件项 10+秒就完了
      

  5.   

    不好意思,下午陪同学买鞋去了,代码如下://现在开始建立一个链表保存所有的文件夹
      CFileFind finder;
    mylist.AddTail("E:\\."); //mylist为一全局变量CList<CString,CString&>mylist
    BOOL bWorking=finder.FindFile("E:\\*.*");
      CString temname;//用来临时储存找到的文件夹名
    while(bWorking)
    {
    bWorking=finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())//如果是文件夹就把它加入链表
    {temname=finder.GetFilePath();
    mylist.AddTail(temname);}
    }
        
      for(POSITION pos=mylist.GetHeadPosition();pos!=NULL;)
    {
    CFileFind fiender;
    bWorking=fiender.FindFile((LPCSTR)(mylist.GetNext(pos)+"\\*.*"));//在链表中的文件夹下继续查 while(bWorking) //文件夹
      {
    bWorking=finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())
    {temname=finder.GetFilePath();
    mylist.AddTail(temname);}//我猜想是这步太耗时间
    }
    }
      

  6.   

    11楼代码没贴好,我再贴
    //现在开始建立一个链表保存所有的文件夹
      CFileFind finder;
    mylist.AddTail("E:\\."); //mylist为一全局变量CList<CString,CString&>mylist
    BOOL bWorking=finder.FindFile("E:\\*.*");
      CString temname;//用来临时储存找到的文件夹名
    while(bWorking)
    {
    bWorking=finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())//如果是文件夹就把它加入链表
    {temname=finder.GetFilePath();
    mylist.AddTail(temname);}
    }
        
      for(POSITION pos=mylist.GetHeadPosition();pos!=NULL;)
    {
    CFileFind fiender;
    bWorking=fiender.FindFile((LPCSTR)(mylist.GetNext(pos)+"\\*.*"));//在链表中的文件夹下继 while(bWorking)                                                  //文件夹
      {
    bWorking=finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())
    {temname=finder.GetFilePath();
    mylist.AddTail(temname);}//是文件夹就加入链表,我猜想是这步太耗时间
    }
    }
      

  7.   

    原来你是那个问CList的少年啊。while(list.IsEmpty() == FALSE)
    {
    1 从ROOT开始 EnumFolder->list.add(folder) 这时候 list里就是ROOT下第一级文件夹
      然后EnumFile得到ROOT下的文件2 for(list.begin() -> list.end()) -> 依次调用第[1]步,执行一次就将这个文件夹从list中删除
      所以list中始终保存的是还没有解析的文件夹
    }
      

  8.   


    我不想删除解析过的文件夹,因为建链表就是为了把它们保存起来给另一个函数查找指定文件用你看我贴的代码有错误吗?哥哥你好像不是用的CList啊
      

  9.   

    文件的图标并没有记录在那里面,文件图标是由Shell管理的,需要调用IShellIcon或者SHGetFileInfo获得。
      

  10.   

    找到56403个文件, 11147个文件夹
    用时69592
    Press any key to continue递归用了1分钟
      

  11.   

    有新的发现
    我的E盘有三个文件夹(当然下面有子文件)
    一个是360Downloads
    一个是KwDownloads
    一个是StormMedia
    前两个可以遍历,用时很短遍历第三个StormMedia确等了老久没结果。我怀疑就是它让我遍历不了E盘
    且它还没有前两个文件夹复杂,子文件路径明显没前两个的深
    这是为什么?
      

  12.   

    OutputDebugStrings你的代码里面for(POSITION pos=mylist.GetHeadPosition();pos!=NULL;)
    {
    CFileFind fiender;
    bWorking=fiender.FindFile((LPCSTR)(mylist.GetNext(pos)+"\\*.*"));//在链表中的文件夹下继 while(bWorking) //文件夹
      {
    bWorking=finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())
    {temname=finder.GetFilePath();
    mylist.AddTail(temname);}//是文件夹就加入链表,我猜想是这步太耗时间
    }
    抱着试一试的态度int dircnt = mylist.size(); //计算当前list元素个数,CList中该用什么我不知道
    for(int n = 0; n < dircnt; n++)

    {
    CFileFind fiender;
    bWorking=fiender.FindFile((LPCSTR)(mylist.GetNext(0)+"\\*.*"));//这里使用取list中第一个while(bWorking) //文件夹
      {
    bWorking=finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())
    {temname=finder.GetFilePath();
    mylist.AddTail(temname);}mylist.pop_front(); //将第一个元素删除,CList中用什么不知道
    }
      

  13.   

    不想删除就增加一个计数器int dirread = 0; //全局
    for(POSITION pos=mylist.GetHeadPosition() + dirread;pos!=NULL;)
    {
    CFileFind fiender;
    bWorking=fiender.FindFile((LPCSTR)(mylist.GetNext(dirread)+"\\*.*"));
    while(bWorking) //文件夹
      {
    bWorking=finder.FindNextFile();
    if(finder.IsDirectory()&&!finder.IsDots())
    {temname=finder.GetFilePath();
    mylist.AddTail(temname);}dirread++;}
      

  14.   

    dirread++; 放到mylist.AddTail(temname); 后面
      

  15.   

    dirread++ 放到 for(POSITION pos=mylist.GetHeadPosition() + dirread;pos!=NULL;)里面最后
      

  16.   


    为什么要删除或者用计算器了。
    mylist.GetNext(pos)会自动移动到下一个。
    不是这个问题啊
      

  17.   

    GetNext如果可以移动那就不需要了,从你给的代码看没问题的,我解析文件系统时也是这个方法你到StormMedia那里下断跟一下呢
      

  18.   

    我不会断跟,我把StormMedia删了在遍历,发现只能查找两层的文件,路径深的没有
      

  19.   

    加个判断条件,if(StormMedia目录的话) __asm int 3;
    自然就会在那个目录时被调试器中断下来的~