#include <windows.h>
#include <stdio.h>
ULONG i = 0;
void FindFile(char * pFilePath)
{
WIN32_FIND_DATA FindFileData;
char Dir[MAX_PATH];
strcat (strcpy (Dir, pFilePath), "\\*");
HANDLE hFind = FindFirstFile(Dir, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) return;
do
{
if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) //找到文件
{
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
printf ("%-73s%lu \n",Dir,++i);
}
else if(FindFileData.cFileName[0]!='.') //找到目录
{
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
FindFile(Dir);
}
}
while (FindNextFile(hFind, &FindFileData));
}
int main()
{
FindFile("i:");
}
代码2:
#include <windows.h>
#include <stdio.h>
ULONG i = 0;
void FindFile(char * pFilePath)
{
WIN32_FIND_DATA FindFileData;
char Dir[MAX_PATH];
strcat (strcpy (Dir, pFilePath), "\\*");
HANDLE hFind = FindFirstFile(Dir, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) return;
do
{
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) //找到文件
{
printf ("%-73s%lu \n",Dir,++i);
}
else if(FindFileData.cFileName[0]!='.') //找到目录
{
FindFile(Dir);
}
}
while (FindNextFile(hFind, &FindFileData));
}
int main()
{
FindFile("i:");
}
代码一在遍历i盘下所有文件的时候正常显示,
修改成代码二,运行后遍历到一半的时候,程序就崩溃了,请问哪里出了问题了,我只是改变了下顺序吧 代码二实在看不出来和代码一有啥明显的差异啊。
另外代码一虽然程序不崩溃,可有些时候遍历的文件数目怎么跟实际数目不符啊,特别是一些保存的网页文件,是因为编码吗?
15 个解决方案
#1
在调试模式下运行程序,出错了点中断,通过调用堆栈定位到相关位置,分析原因
#2
看不懂啊
#3
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
#4
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
#5
在一台被精简了的系统 没有dir.exe程序的情况下 咋弄呢?
#6
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
#7
不是给出了,是执行strcat时崩的
检查strcpy返回的指针是否有效,检查字符是否越界,检查拷贝的字符串是否以\0结尾
#8
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
#9
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
#10
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
是不是越界了,每次执行这条语句:
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
你有没有对Dir清空,不清空,strcat就会按照上次的末尾('\0')继续追加,如果文件这么多肯定会导致越界呢。
建议每次得到一个文件路径后,就要把Dir清空一下,memset一下(清空为0)
#11
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
是不是越界了,每次执行这条语句:strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
你有没有对Dir清空,不清空,strcat就会按照上次的末尾('\0')继续追加,如果文件这么多肯定会导致越界呢。
建议每次得到一个文件路径后,就要把Dir清空一下,memset一下(清空为0)
拜托你专心点好吗?我猜你就随便看看吧 肯定都没运行,
第一,这个代码大部分时候是可以用的 只是小概率的遇到一些文件会崩溃,
第二,Dir用得着清空吗?请仔细看strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); strcpy每次都会把pFilePath复制到Dir数组里,即每次都是从头覆盖,然后才连接\\和获取到的文件名啊 请认真点 ok? 看仔细了 最里面的是 strcpy
#12
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
是不是越界了,每次执行这条语句:strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
你有没有对Dir清空,不清空,strcat就会按照上次的末尾('\0')继续追加,如果文件这么多肯定会导致越界呢。
建议每次得到一个文件路径后,就要把Dir清空一下,memset一下(清空为0)
拜托你专心点好吗?我猜你就随便看看吧 肯定都没运行,
第一,这个代码大部分时候是可以用的 只是小概率的遇到一些文件会崩溃,
第二,Dir用得着清空吗?请仔细看strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); strcpy每次都会把pFilePath复制到Dir数组里,即每次都是从头覆盖,然后才连接\\和获取到的文件名啊 请认真点 ok? 看仔细了 最里面的是 strcpy
抱歉我的系统是Ubuntu
那我问一下,楼上各位给你提出的建议你又有没有使用一下呢?
建议将两个strcat分两步做,不用strcat调用strcat,并且对返回值做一下判断。
别人给你的建议,建议你也试试,不要有抵触和让别人一步到位给你解决问题。我看别人帮你,你却这个态度,还怎么继续帮你?!
#13
刚才又试了下换成了微软的lstcat lstrcpy
这样就能解决 之前枚举文件中崩溃的问题了,但实际上虽然稳定了 但获取的文件数量 少了5个 而实际文件确实有那几个 用strcat就不会少 但有时候会崩溃。。。
lstrcat(lstrcat(lstrcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
这样就能解决 之前枚举文件中崩溃的问题了,但实际上虽然稳定了 但获取的文件数量 少了5个 而实际文件确实有那几个 用strcat就不会少 但有时候会崩溃。。。
#14
不要空想,学会调试,崩溃时断下来,观察和谈量的值,看是遍历到哪个文件崩溃,看是什么原因崩溃,把这个文件单独复制出来看会不会崩溃,只是想你解决不了问题
#15
dir不是exe,是cmd.exe内部实现的命令。
#1
在调试模式下运行程序,出错了点中断,通过调用堆栈定位到相关位置,分析原因
#2
在调试模式下运行程序,出错了点中断,通过调用堆栈定位到相关位置,分析原因
看不懂啊
#3
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
#4
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
#5
system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt");
//读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。
如果嫌system黑窗口一闪,将system("...")替换为WinExec("cmd /c ...",SW_HIDE);
在一台被精简了的系统 没有dir.exe程序的情况下 咋弄呢?
#6
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
#7
在调试模式下运行程序,出错了点中断,通过调用堆栈定位到相关位置,分析原因
看不懂啊
不是给出了,是执行strcat时崩的
检查strcpy返回的指针是否有效,检查字符是否越界,检查拷贝的字符串是否以\0结尾
#8
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
#9
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
#10
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
是不是越界了,每次执行这条语句:
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
你有没有对Dir清空,不清空,strcat就会按照上次的末尾('\0')继续追加,如果文件这么多肯定会导致越界呢。
建议每次得到一个文件路径后,就要把Dir清空一下,memset一下(清空为0)
#11
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
是不是越界了,每次执行这条语句:strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
你有没有对Dir清空,不清空,strcat就会按照上次的末尾('\0')继续追加,如果文件这么多肯定会导致越界呢。
建议每次得到一个文件路径后,就要把Dir清空一下,memset一下(清空为0)
拜托你专心点好吗?我猜你就随便看看吧 肯定都没运行,
第一,这个代码大部分时候是可以用的 只是小概率的遇到一些文件会崩溃,
第二,Dir用得着清空吗?请仔细看strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); strcpy每次都会把pFilePath复制到Dir数组里,即每次都是从头覆盖,然后才连接\\和获取到的文件名啊 请认真点 ok? 看仔细了 最里面的是 strcpy
#12
strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
建议判断内部的strcat的返回值,然后确认一下FindFileData.cFileNmae的值,这些变量或返回值建议打印出来。
感觉这句话是没问题的 分散写代码里都没问题 ,而且我用sprintf来连接路径和文件名, 放在代码二的位置替换这句话 还是运行到一半就崩溃
你需要确认strcat的参数,因此需要将他们都打印出来
都打印出来了啊 编译运行 都出来了 代码写的很简单啊 打印的就是 最后用strcat连接到Dir数组里的信息啊 strcat返回值就是 连接后的指针啊
FindFileData.cFileNmae
就是每次获取的文件名啊 我是跟路径连接在一起了 如果发现目录没文件 就不会循环也不会输出啊
我的i盘有十万多文件 枚举出6万多的时候 崩溃了 代码一则不会崩溃 我就是问 代码二有啥写的不对吗 为什么代码一就没问题
是不是越界了,每次执行这条语句:strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
你有没有对Dir清空,不清空,strcat就会按照上次的末尾('\0')继续追加,如果文件这么多肯定会导致越界呢。
建议每次得到一个文件路径后,就要把Dir清空一下,memset一下(清空为0)
拜托你专心点好吗?我猜你就随便看看吧 肯定都没运行,
第一,这个代码大部分时候是可以用的 只是小概率的遇到一些文件会崩溃,
第二,Dir用得着清空吗?请仔细看strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); strcpy每次都会把pFilePath复制到Dir数组里,即每次都是从头覆盖,然后才连接\\和获取到的文件名啊 请认真点 ok? 看仔细了 最里面的是 strcpy
抱歉我的系统是Ubuntu
那我问一下,楼上各位给你提出的建议你又有没有使用一下呢?
建议将两个strcat分两步做,不用strcat调用strcat,并且对返回值做一下判断。
别人给你的建议,建议你也试试,不要有抵触和让别人一步到位给你解决问题。我看别人帮你,你却这个态度,还怎么继续帮你?!
#13
刚才又试了下换成了微软的lstcat lstrcpy
这样就能解决 之前枚举文件中崩溃的问题了,但实际上虽然稳定了 但获取的文件数量 少了5个 而实际文件确实有那几个 用strcat就不会少 但有时候会崩溃。。。
lstrcat(lstrcat(lstrcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);
这样就能解决 之前枚举文件中崩溃的问题了,但实际上虽然稳定了 但获取的文件数量 少了5个 而实际文件确实有那几个 用strcat就不会少 但有时候会崩溃。。。
#14
不要空想,学会调试,崩溃时断下来,观察和谈量的值,看是遍历到哪个文件崩溃,看是什么原因崩溃,把这个文件单独复制出来看会不会崩溃,只是想你解决不了问题
#15
dir不是exe,是cmd.exe内部实现的命令。