none
Windows server 2008 使用findfirsfile访问共享文件返回失败或延迟 RRS feed

  • 问题

  • 1、访问和被访问机都是Windows server 2008 r2 标准版

    2、a机共享一个文件夹,并在其中创建若干文件

    3、b机通过FindFirstFile方法访问共享路径中 //ip/dir/filename.a 文件

    4、步骤3中有时成功,有时失败,GetlastError 返回3

    5、步骤3中进行循环,直到FindFirstFile返回成功,有时一次成功,有时要很多次,循环经历数秒至十数秒后才返回成功

    这个是什么情况?为什么会有访问发现的延迟?如何解决?

    2014年5月16日 1:58

答案

  • 你好:

    我在控制台应用上测试了下FindFirstFile这个函数,没有发现这个函数会发生GetlastError为3问题。下面是我的测试代码:

    #include "stdafx.h"
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    void _tmain(int argc, TCHAR *argv[])
    {
       WIN32_FIND_DATA FindFileData;
       HANDLE hFind;
    
       for (int i = 0; i < 1000; i++)
       {
    
    	   hFind = FindFirstFile(TEXT("D:\\test.txt"), &FindFileData);
    	   if (hFind == INVALID_HANDLE_VALUE) 
    	   {
    		  printf ("FindFirstFile failed (%d)\n", GetLastError());
    		  break;
    	   } 
    	   else 
    	   {
    		  _tprintf (TEXT("The first file found is %s,%d\n"), 
    					FindFileData.cFileName,i);
    		  FindClose(hFind);
    	   }
       }
       getchar();
    }

    测试结果截图如下:

    虽然只是在本地磁盘的测试,但是基本可以排除错误原因出现在该函数上了。那么,我们就需要检查下面两点:

    1.该文件设置了共享访问权限,你可以去检查一下手动查找是否可以次次成功。

    2.延迟只会出现在server访问上,如果是这种情况导致的查询失败,我建议你到windows server去寻找相关的帮助。

    2014年5月18日 13:51
    版主

全部回复

  • 你好:

    我在控制台应用上测试了下FindFirstFile这个函数,没有发现这个函数会发生GetlastError为3问题。下面是我的测试代码:

    #include "stdafx.h"
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    void _tmain(int argc, TCHAR *argv[])
    {
       WIN32_FIND_DATA FindFileData;
       HANDLE hFind;
    
       for (int i = 0; i < 1000; i++)
       {
    
    	   hFind = FindFirstFile(TEXT("D:\\test.txt"), &FindFileData);
    	   if (hFind == INVALID_HANDLE_VALUE) 
    	   {
    		  printf ("FindFirstFile failed (%d)\n", GetLastError());
    		  break;
    	   } 
    	   else 
    	   {
    		  _tprintf (TEXT("The first file found is %s,%d\n"), 
    					FindFileData.cFileName,i);
    		  FindClose(hFind);
    	   }
       }
       getchar();
    }

    测试结果截图如下:

    虽然只是在本地磁盘的测试,但是基本可以排除错误原因出现在该函数上了。那么,我们就需要检查下面两点:

    1.该文件设置了共享访问权限,你可以去检查一下手动查找是否可以次次成功。

    2.延迟只会出现在server访问上,如果是这种情况导致的查询失败,我建议你到windows server去寻找相关的帮助。

    2014年5月18日 13:51
    版主
  • 你好,谢谢您的积极答复。

    但是正如您所说,本地文件通过该函数查找没有问题,只有通过网络路径查找时会有出现last error 3 的情况。

    根据您的建议,我尝试手动验证权限,几乎都能访问成功,用“几乎”这个词,是因为,有时手动访问,返回速度稍慢,不象多数那样迅速,但最终都正常访问了。

    您的第二个建议,我其实是先在server区提问的,那里建议我过来的,很是迷茫。

    最后,该问题依然存在,希望各位前辈予以解惑,谢谢

    2014年5月30日 3:47
  • 你好:

    感谢你的反馈!

    》根据您的建议,我尝试手动验证权限,几乎都能访问成功,用“几乎”这个词,是因为,有时手动访问,返回速度稍慢,不象多数那样迅速,但最终都正常访问了。

    根据你亲自动手的结果,如果手动验证权限,只会有返回速度稍慢,并不存在getlasterror返回3的情况。

    这样我们就可以得出这样的结论,导致错误的原因不是在函数上,也不是在代码本身上。所以出现上面的原因,你应该联系server那边的专家帮你troubleshoot这个问题。为了得到更好的支持,你需要在server论坛详细叙述你的问题。

    2014年6月4日 7:17
    版主