有没有访问NTFS文件系统USN日志的API函数 据说NTFS文件系统有一个文件列表区保存了所有文件的信息,我想访问它。主要获取文件名,文件路径,文件的图标。求帮助 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 文件系统没有保存那些东西 API也是根据PE信息获取的 而文件系统只是提供一种存储管理方式 你想读取日志文件 有两种方法 1 通过ReadFile(PHYSICALDRIVE)来手动定位MFT记录2 通过DeviceIoControl(FSCTL_GET_NTFS_FILE_RECORD)得到MFT记录最后还是要你自己解析 能说一下DeviceIoControl我只找到在VB中的声明,英文有看不懂!它是windows API函数吗? 10几分钟算法问题吧我手动解析NTFS 8w个文件项 10+秒就完了 不好意思,下午陪同学买鞋去了,代码如下://现在开始建立一个链表保存所有的文件夹 CFileFind finder;mylist.AddTail("E:\\."); //mylist为一全局变量CList<CString,CString&>mylistBOOL 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);}//我猜想是这步太耗时间}} 11楼代码没贴好,我再贴//现在开始建立一个链表保存所有的文件夹 CFileFind finder;mylist.AddTail("E:\\."); //mylist为一全局变量CList<CString,CString&>mylistBOOL 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);}//是文件夹就加入链表,我猜想是这步太耗时间}} 原来你是那个问CList的少年啊。while(list.IsEmpty() == FALSE){1 从ROOT开始 EnumFolder->list.add(folder) 这时候 list里就是ROOT下第一级文件夹 然后EnumFile得到ROOT下的文件2 for(list.begin() -> list.end()) -> 依次调用第[1]步,执行一次就将这个文件夹从list中删除 所以list中始终保存的是还没有解析的文件夹} 我不想删除解析过的文件夹,因为建链表就是为了把它们保存起来给另一个函数查找指定文件用你看我贴的代码有错误吗?哥哥你好像不是用的CList啊 文件的图标并没有记录在那里面,文件图标是由Shell管理的,需要调用IShellIcon或者SHGetFileInfo获得。 找到56403个文件, 11147个文件夹用时69592Press any key to continue递归用了1分钟 有新的发现我的E盘有三个文件夹(当然下面有子文件)一个是360Downloads一个是KwDownloads一个是StormMedia前两个可以遍历,用时很短遍历第三个StormMedia确等了老久没结果。我怀疑就是它让我遍历不了E盘且它还没有前两个文件夹复杂,子文件路径明显没前两个的深这是为什么? 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中用什么不知道} 不想删除就增加一个计数器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++;} dirread++; 放到mylist.AddTail(temname); 后面 dirread++ 放到 for(POSITION pos=mylist.GetHeadPosition() + dirread;pos!=NULL;)里面最后 为什么要删除或者用计算器了。mylist.GetNext(pos)会自动移动到下一个。不是这个问题啊 GetNext如果可以移动那就不需要了,从你给的代码看没问题的,我解析文件系统时也是这个方法你到StormMedia那里下断跟一下呢 我不会断跟,我把StormMedia删了在遍历,发现只能查找两层的文件,路径深的没有 加个判断条件,if(StormMedia目录的话) __asm int 3;自然就会在那个目录时被调试器中断下来的~ 关于VC6.0 MFC的调试问题 用已有的ocx重新封装新的ocx 控件打包? 怎样在窗口改变大小时改变CStatic控件的大小? 怎样给我觉得好的答复者分呢??知恩图报 请问各位有那位知道反汇编!----谢谢 怎样编程判断计算机是否支持acpi电源管理 各位大虾请帮忙???? 文件操作的问题,请各位帮忙 大家都用什么工具作help啊? MFC模仿“句柄精灵”拖动放大镜获取窗口句柄的问题 大侠们帮忙解释下这段代码是什么意思?
1 通过ReadFile(PHYSICALDRIVE)来手动定位MFT记录
2 通过DeviceIoControl(FSCTL_GET_NTFS_FILE_RECORD)得到MFT记录最后还是要你自己解析
能说一下DeviceIoControl我只找到在VB中的声明,英文有看不懂!
它是windows API函数吗?
我手动解析NTFS 8w个文件项 10+秒就完了
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);}//我猜想是这步太耗时间
}
}
//现在开始建立一个链表保存所有的文件夹
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);}//是文件夹就加入链表,我猜想是这步太耗时间
}
}
{
1 从ROOT开始 EnumFolder->list.add(folder) 这时候 list里就是ROOT下第一级文件夹
然后EnumFile得到ROOT下的文件2 for(list.begin() -> list.end()) -> 依次调用第[1]步,执行一次就将这个文件夹从list中删除
所以list中始终保存的是还没有解析的文件夹
}
我不想删除解析过的文件夹,因为建链表就是为了把它们保存起来给另一个函数查找指定文件用你看我贴的代码有错误吗?哥哥你好像不是用的CList啊
用时69592
Press any key to continue递归用了1分钟
我的E盘有三个文件夹(当然下面有子文件)
一个是360Downloads
一个是KwDownloads
一个是StormMedia
前两个可以遍历,用时很短遍历第三个StormMedia确等了老久没结果。我怀疑就是它让我遍历不了E盘
且它还没有前两个文件夹复杂,子文件路径明显没前两个的深
这是为什么?
{
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中用什么不知道
}
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++;}
为什么要删除或者用计算器了。
mylist.GetNext(pos)会自动移动到下一个。
不是这个问题啊
自然就会在那个目录时被调试器中断下来的~