user-0 提问: 代码哪里错了？找不出来啊

回复:
user: user-1
content: 在调试模式下运行程序，出错了点中断，通过调用堆栈定位到相关位置，分析原因

user: user-2
content: dir不是exe,是cmd.exe内部实现的命令。

user: user-1
content: 不要空想，学会调试，崩溃时断下来，观察和谈量的值，看是遍历到哪个文件崩溃，看是什么原因崩溃，把这个文件单独复制出来看会不会崩溃，只是想你解决不了问题

user: user-3
content: 引用 11 楼 wqte45 的回复:[quote=引用 10 楼 cfjtaishan 的回复:] [quote=引用 9 楼 wqte45 的回复:] [quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 6 楼 wqte45 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 建议判断内部的strcat的返回值，然后确认一下FindFileData.cFileNmae的值，这些变量或返回值建议打印出来。  感觉这句话是没问题的  分散写代码里都没问题  ，而且我用sprintf来连接路径和文件名， 放在代码二的位置替换这句话  还是运行到一半就崩溃[/quote] 你需要确认strcat的参数，因此需要将他们都打印出来[/quote]   都打印出来了啊  编译运行 都出来了 代码写的很简单啊  打印的就是 最后用strcat连接到Dir数组里的信息啊  strcat返回值就是 连接后的指针啊 FindFileData.cFileNmae 就是每次获取的文件名啊  我是跟路径连接在一起了   如果发现目录没文件 就不会循环也不会输出啊  我的i盘有十万多文件  枚举出6万多的时候 崩溃了  代码一则不会崩溃  我就是问 代码二有啥写的不对吗 为什么代码一就没问题[/quote] 是不是越界了，每次执行这条语句： strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 你有没有对Dir清空，不清空，strcat就会按照上次的末尾('\0')继续追加，如果文件这么多肯定会导致越界呢。 建议每次得到一个文件路径后，就要把Dir清空一下，memset一下（清空为０） [/quote]  拜托你专心点好吗？我猜你就随便看看吧 肯定都没运行，  第一，这个代码大部分时候是可以用的 只是小概率的遇到一些文件会崩溃， 第二，Dir用得着清空吗？请仔细看strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);   strcpy每次都会把pFilePath复制到Dir数组里，即每次都是从头覆盖，然后才连接\\和获取到的文件名啊 请认真点 ok？ 看仔细了 最里面的是 strcpy [/quote] 抱歉我的系统是Ubuntu 那我问一下，楼上各位给你提出的建议你又有没有使用一下呢？ 建议将两个strcat分两步做，不用strcat调用strcat，并且对返回值做一下判断。 别人给你的建议，建议你也试试，不要有抵触和让别人一步到位给你解决问题。我看别人帮你，你却这个态度，还怎么继续帮你？！

user: user-0
content: 刚才又试了下换成了微软的lstcat  lstrcpy  lstrcat(lstrcat(lstrcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);  这样就能解决 之前枚举文件中崩溃的问题了，但实际上虽然稳定了 但获取的文件数量 少了5个  而实际文件确实有那几个  用strcat就不会少 但有时候会崩溃。。。

user: user-0
content: 引用 10 楼 cfjtaishan 的回复:[quote=引用 9 楼 wqte45 的回复:] [quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 6 楼 wqte45 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 建议判断内部的strcat的返回值，然后确认一下FindFileData.cFileNmae的值，这些变量或返回值建议打印出来。  感觉这句话是没问题的  分散写代码里都没问题  ，而且我用sprintf来连接路径和文件名， 放在代码二的位置替换这句话  还是运行到一半就崩溃[/quote] 你需要确认strcat的参数，因此需要将他们都打印出来[/quote]   都打印出来了啊  编译运行 都出来了 代码写的很简单啊  打印的就是 最后用strcat连接到Dir数组里的信息啊  strcat返回值就是 连接后的指针啊 FindFileData.cFileNmae 就是每次获取的文件名啊  我是跟路径连接在一起了   如果发现目录没文件 就不会循环也不会输出啊  我的i盘有十万多文件  枚举出6万多的时候 崩溃了  代码一则不会崩溃  我就是问 代码二有啥写的不对吗 为什么代码一就没问题[/quote] 是不是越界了，每次执行这条语句： strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 你有没有对Dir清空，不清空，strcat就会按照上次的末尾('\0')继续追加，如果文件这么多肯定会导致越界呢。 建议每次得到一个文件路径后，就要把Dir清空一下，memset一下（清空为０） [/quote]  拜托你专心点好吗？我猜你就随便看看吧 肯定都没运行，  第一，这个代码大部分时候是可以用的 只是小概率的遇到一些文件会崩溃， 第二，Dir用得着清空吗？请仔细看strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName);   strcpy每次都会把pFilePath复制到Dir数组里，即每次都是从头覆盖，然后才连接\\和获取到的文件名啊 请认真点 ok？ 看仔细了 最里面的是 strcpy

user: user-3
content: 引用 9 楼 wqte45 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] [quote=引用 6 楼 wqte45 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 建议判断内部的strcat的返回值，然后确认一下FindFileData.cFileNmae的值，这些变量或返回值建议打印出来。  感觉这句话是没问题的  分散写代码里都没问题  ，而且我用sprintf来连接路径和文件名， 放在代码二的位置替换这句话  还是运行到一半就崩溃[/quote] 你需要确认strcat的参数，因此需要将他们都打印出来[/quote]   都打印出来了啊  编译运行 都出来了 代码写的很简单啊  打印的就是 最后用strcat连接到Dir数组里的信息啊  strcat返回值就是 连接后的指针啊 FindFileData.cFileNmae 就是每次获取的文件名啊  我是跟路径连接在一起了   如果发现目录没文件 就不会循环也不会输出啊  我的i盘有十万多文件  枚举出6万多的时候 崩溃了  代码一则不会崩溃  我就是问 代码二有啥写的不对吗 为什么代码一就没问题[/quote] 是不是越界了，每次执行这条语句： strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 你有没有对Dir清空，不清空，strcat就会按照上次的末尾('\0')继续追加，如果文件这么多肯定会导致越界呢。 建议每次得到一个文件路径后，就要把Dir清空一下，memset一下（清空为０）

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 6 楼 wqte45 的回复:] [quote=引用 4 楼 cfjtaishan 的回复:] strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 建议判断内部的strcat的返回值，然后确认一下FindFileData.cFileNmae的值，这些变量或返回值建议打印出来。  感觉这句话是没问题的  分散写代码里都没问题  ，而且我用sprintf来连接路径和文件名， 放在代码二的位置替换这句话  还是运行到一半就崩溃[/quote] 你需要确认strcat的参数，因此需要将他们都打印出来[/quote]   都打印出来了啊  编译运行 都出来了 代码写的很简单啊  打印的就是 最后用strcat连接到Dir数组里的信息啊  strcat返回值就是 连接后的指针啊 FindFileData.cFileNmae 就是每次获取的文件名啊  我是跟路径连接在一起了   如果发现目录没文件 就不会循环也不会输出啊  我的i盘有十万多文件  枚举出6万多的时候 崩溃了  代码一则不会崩溃  我就是问 代码二有啥写的不对吗 为什么代码一就没问题

user: user-3
content: 引用 6 楼 wqte45 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 建议判断内部的strcat的返回值，然后确认一下FindFileData.cFileNmae的值，这些变量或返回值建议打印出来。  感觉这句话是没问题的  分散写代码里都没问题  ，而且我用sprintf来连接路径和文件名， 放在代码二的位置替换这句话  还是运行到一半就崩溃[/quote] 你需要确认strcat的参数，因此需要将他们都打印出来

user: user-1
content: 引用 2 楼 那年那人的回复:[quote=引用 1 楼 paschen 的回复:] 在调试模式下运行程序，出错了点中断，通过调用堆栈定位到相关位置，分析原因  看不懂啊  [/quote] 不是给出了，是执行strcat时崩的  检查strcpy返回的指针是否有效，检查字符是否越界，检查拷贝的字符串是否以\0结尾

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 建议判断内部的strcat的返回值，然后确认一下FindFileData.cFileNmae的值，这些变量或返回值建议打印出来。  感觉这句话是没问题的  分散写代码里都没问题  ，而且我用sprintf来连接路径和文件名， 放在代码二的位置替换这句话  还是运行到一半就崩溃

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复: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程序的情况下 咋弄呢？

user: user-3
content: strcat(strcat(strcpy(Dir, pFilePath), "\\"), FindFileData.cFileName); 建议判断内部的strcat的返回值，然后确认一下FindFileData.cFileNmae的值，这些变量或返回值建议打印出来。

user: user-2
content: 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);

user: user-0
content: 引用 1 楼 paschen 的回复:在调试模式下运行程序，出错了点中断，通过调用堆栈定位到相关位置，分析原因  看不懂啊