现在我有一个需求,就是能够快速搜索文件目录下的制定类型或者名称或者。。总之和Windows搜索目录机制差不多,目前我知道几种方法:
           1). 通过FindFirstFile等API函数来实现.
           2)  通过使用Dos Tree导出文件目录和文件到文件的方法. 
           3)  通过使用usn日志这个方法有一款软件Everthing就是使用这个技术,但存在弊端,就是只能使用在NTFS的磁盘分区中使用,我想问问有没有做过这方面开发的朋友,怎么使用usn呢?多谢了

解决方案 »

  1.   

    第1种是通常的做法,利用多线程可以提高效率。
    第2种与第1种类似,但比第1种要慢。
    第3种实际上是利用系统功能建立了一个索引,利用索引实现搜索,速度快是因为这种方法把搜索所需要的时间转移到了系统的日常使用中,换种说法,它牺牲了系统的运行效率。到MSDN网站搜索估计可以找到编程方法。也可以自己建索引,这样就可以不受文件系统的限制了。
    此外还有两种方法可以考虑:
    1、用ZwQueryDirectoryFile获取目录中的文件信息,这种方法与FindFirstFile相比减少了中间开销;
    2、获取目录数据在磁盘中的储存位置,直接读取其数据来分析,这种做法需要了解文件系统的内部结构。
      

  2.   


    BOOL DeviceIoControl(
      (HANDLE) hDevice,            // handle to volume
      FSCTL_QUERY_USN_JOURNAL,     // dwIoControlCode
      NULL,                        // lpInBuffer
      0,                           // nInBufferSize
      (LPVOID) lpOutBuffer,        // output buffer
      (DWORD) nOutBufferSize,      // size of output buffer
      (LPDWORD) lpBytesReturned,   // number of bytes returned
      (LPOVERLAPPED) lpOverlapped  // OVERLAPPED structure
    );
    lpOutBuffer是下面这个:typedef struct {
      DWORDLONG UsnJournalID;
      USN       FirstUsn;
      USN       NextUsn;
      USN       LowestValidUsn;
      USN       MaxUsn;
      DWORDLONG MaximumSize;
      DWORDLONG AllocationDelta;
    } USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
    用USN是很麻烦的一件事情,用到磁盘级别的查询操作。1L的大牛说了3种方法,我这里再说3种1、解析磁盘,这种是最快最高效的。我称它为强奸磁盘,用USN并不快,因为他有和驱动交互的过程,驱动还是要执行磁盘的解析,然后返回结果给你2、这种有一定的局限性,必须在Vista以上的系统才支持
    系统平时会为你的文件创建索引并在系统内部建立了数据库,怎么访问这个数据库呢?
    OLEDB连接字符串为"Provider=Search.CollatorDSO.1;EXTENDED PROPERTIES='Application=Windows'";用SQL语句可以查询系统里的文件。参考这个:http://msdn.microsoft.com/en-us/library/bb266517%28VS.85%29.aspx3、用WMI本人曾经用过,觉得用WMI查询文件也是很快的,WMI的调用远比用普通的遍历文件API快得多