免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4578 | 回复: 5
打印 上一主题 下一主题

[C] win7下FindFirstFile 获取句柄 返回 5(拒绝访问),求助[自己解决了] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-05 10:05 |只看该作者 |倒序浏览
本帖最后由 Anleb 于 2013-07-05 15:22 编辑

环境:win7 64位
语言:C
编译:GCC

编译结果: 成功
执行结果:有时候成功,有时候不成功


程序目的:本程序是让用户输入一个目录,删除用户自定义后缀名的所有文件。

问题:
  1.         void findAllFile(char *pFilePath,char *extName)
  2. {  
  3.         WIN32_FIND_DATA FindFileData;  
  4.         DWORD dwError;  
  5.         HANDLE hFind = INVALID_HANDLE_VALUE;  
  6.         char DirSpec[MAX_PATH+1];
  7.         strncpy(DirSpec, pFilePath, strlen(pFilePath) + 1);  
  8.         SetCurrentDirectory(pFilePath);  
  9.         strncat(DirSpec, "\\*", 3);  
  10.         hFind = FindFirstFile(DirSpec, &FindFileData);  
  11.         if (hFind == INVALID_HANDLE_VALUE){  
  12.        printf ("Invalid file handle. Error is %u\n", GetLastError());  
  13.               return ;  
  14.         }
  15.         }
复制代码
当我尝试打开 C盘(系统盘)时,就会返回  GetLastError() = 5,当我尝试在其他磁盘获取句柄时,没有问题,我怀疑是 权限问题,
请大家帮看看

注意:当我尝试在方法开头 printf(pFilePath); 问题 居然不会出现了,很诡异。


附上 源码,希望大家帮助我。
  1. #include <stdio.h>
  2. #include <direct.h> //_getcwd(), _chdir()
  3. #include <stdlib.h> //_MAX_PATH, system()
  4. #include <io.h>     //_finddata_t, _findfirst(), _findnext(), _findclose()
  5. #include <string.h>
  6. #include <windows.h>

  7. //获取后缀名
  8. char *substr(const char*str)
  9. {
  10.     char *ptr, c = '.';
  11.     static char stbuf[256];
  12.     ptr = strrchr(str, c); //最后一个出现c的位置
  13.     if(ptr == NULL){
  14.        return stbuf;
  15.            }
  16.     int pos = ptr-str;//用指针相减 求得索引
  17.     unsigned start = pos + 1;
  18.     unsigned end = strlen(str);
  19.     unsigned n = end - start;
  20.     strncpy(stbuf, str + start, n);
  21.     stbuf[n] = 0; //字串最后加上0
  22.     return stbuf;
  23. }

  24. //递归查询文件并且删除
  25. void findAllFile(char *pFilePath,char *extName)
  26. {  
  27.         WIN32_FIND_DATA FindFileData;  
  28.         DWORD dwError;  
  29.         HANDLE hFind = INVALID_HANDLE_VALUE;  
  30.         char DirSpec[MAX_PATH+1];
  31.         strncpy(DirSpec, pFilePath, strlen(pFilePath) + 1);  
  32.         SetCurrentDirectory(pFilePath);  
  33.         strncat(DirSpec, "\\*", 3);  
  34.         hFind = FindFirstFile(DirSpec, &FindFileData);  
  35.         if (hFind == INVALID_HANDLE_VALUE){  
  36.        printf ("Invalid file handle. Error is %u\n", GetLastError());  
  37.               return ;  
  38.         }
  39.         else{
  40.                 if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY ){  
  41. //        printf ("%s\n", FindFileData.cFileName);  
  42.                 }
  43.                 else if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY&& strcmp(FindFileData.cFileName, ".") != 0&& strcmp(FindFileData.cFileName, "..") != 0){
  44.         char Dir[MAX_PATH + 1];  
  45.         strcpy(Dir, pFilePath);  
  46.         strncat(Dir, "\\", 2);  
  47.         strcat(Dir, FindFileData.cFileName);  
  48.         findAllFile(Dir,extName);  
  49.                 }
  50.                 while (FindNextFile(hFind, &FindFileData) != 0){
  51.                         if (FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY){
  52.                              char *extname2 = substr(FindFileData.cFileName);
  53.                                       if(strcmp(extname2,extName) ==0){
  54.                                  printf ("FileName:%s   Delete:True\n", FindFileData.cFileName);
  55.                                          remove(FindFileData.cFileName);
  56.                                          }
  57.                         }  
  58.                         else if(FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && strcmp(FindFileData.cFileName, ".") != 0&& strcmp(FindFileData.cFileName, "..") != 0){  
  59.                                 char Dir[MAX_PATH + 1];  
  60.                                 strcpy(Dir, pFilePath);  
  61.                                 strncat(Dir, "\\", 2);  
  62.                                 strcat(Dir, FindFileData.cFileName);  
  63.                                 findAllFile(Dir,extName);  
  64.                         }
  65.                 }
  66.                 dwError = GetLastError();  
  67.                 FindClose(hFind);  
  68.                 if (dwError != ERROR_NO_MORE_FILES) {  
  69.                         printf ("FindNextFile error. Error is %u\n", dwError);  
  70.                         return;  
  71.                 }  
  72.         }  
  73. }  


  74. //开始显示部分
  75. void Show(char str[])
  76. {
  77.          int i,len;
  78.          len = strlen(str);
  79.          for(i=0;i<len;i++)
  80.          {
  81.              printf("%c",str[i]);
  82.              sleep(100);
  83.          }
  84. }


  85. int main(void)
  86. {
  87.         printf("Anleb : ");
  88.         sleep(1000);
  89.         char string1[] = "I am Anleb,nice to somthing!\n";
  90.         Show(string1);
  91.         printf("Anleb : ");
  92.         sleep(1000);
  93.         char string2[] = "Go,gay!\n";
  94.         Show(string2);
  95.         printf("Please Enter the Path:");
  96.         char path[128];
  97.         gets(path);
  98.         printf("Please Enter the ExtName:");
  99.         char extName[10];
  100.         gets(extName);
  101.         findAllFile(path,extName);
  102.         system("pause");
  103.         return 0;          
  104. }
复制代码

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2013-07-05 13:25 |只看该作者
太缺德了,我运行了一下,把文件都删除掉了

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
3 [报告]
发表于 2013-07-05 13:25 |只看该作者
太缺德了,我运行了一下,把文件都删除掉了

论坛徽章:
0
4 [报告]
发表于 2013-07-05 13:33 |只看该作者
回复 3# bruceteen


大哥啊,我已经说明了 我上面程序的目的,你怎么不当心呢。。。


   

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2013-07-05 13:37 |只看该作者
想想就生气,既然你问的是 FindFirstFile 的问题,你就应该将无关的 remove(FindFileData.cFileName) 等删除掉,简化一下代码,只留下相关的代码。
既然你留着 remove(FindFileData.cFileName),那你就应该在一开始的时候,特别注明一下,提醒别人小心。
我好心帮你调试一下,你却害得我将C盘中exe文件删除掉了,现在系统运行一会儿就报错,我都不知道该怎么办才好。真是好心反而被人咬!

论坛徽章:
0
6 [报告]
发表于 2013-07-05 15:21 |只看该作者
回复 5# bruceteen


    .... 不好意思啊 大哥。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP