none
MoveFileEx 移动文件夹 返回错误码:5,拒绝访问 RRS feed

  • 问题

  • bool blRet=MoveFileEx("C:\\1", "C:\\2", MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH)?true:false;

    blRet 返回为false,我通过GetLastError发现0x5

    通过调试我发现 MoveFileEx 移动 C:\\1,当此文件夹的大小在2G左右都是可以移动成功的

    但是如果C:\\1的文件夹大小超过了7G,则无法移动成功,发现错误码5,拒绝访问

    测试环境:

    系统:WIN7,WIN10

    vs2017 15.9.13

    能告诉我为什么吗?

    2019年7月23日 7:21

答案

  • 你好,

    这是我的代码:

    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    
    
    bool blRet = MoveFileEx("D:\\test2", "D:\\10", MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH) ;
    
    int main()
    {
    	if (!blRet)
    	{
    		printf("err is : %d ", GetLastError() );
    		return (0);
    	}
    	else
    		printf(TEXT("MoveFileEx succeed"));
    	return (0);
    }

    运行结果如图所示:

    其中文件夹test2的属性如图所示:

    Best Regards,

    Jeanine Zhang

    • 已标记为答案 Neko_NoW 2019年8月1日 6:05
    2019年8月1日 5:43
    版主

全部回复

  • 你好,

    感谢您在MSDN论坛发帖提问。

    >>MoveFileEx 移动文件夹 返回错误码:5,拒绝访问

    错误5是拒绝访问。在以下情况可能会发生此错误
    1,您无权在目标目录中写入
    2,您无权覆盖目标目录中具有相同名称的现有文件。

    我认为你的问题更偏向于第二个:要覆盖的文件被锁定。我建议你可以尝试验证任何应用程序都没有使用C:\\1,并且它没有运行(通过任务管理器)。然后尝试在资源管理器中手动移动该文件(这将验证当前登录的用户是否有权移动文件)。

    Best Regards,

    Jeanine Zhang

    2019年7月23日 9:34
    版主
  • 你好,

    感谢您在MSDN论坛发帖提问。

    >>MoveFileEx 移动文件夹 返回错误码:5,拒绝访问

    错误5是拒绝访问。在以下情况可能会发生此错误
    1,您无权在目标目录中写入
    2,您无权覆盖目标目录中具有相同名称的现有文件。

    我认为你的问题更偏向于第二个:要覆盖的文件被锁定。我建议你可以尝试验证任何应用程序都没有使用C:\\1,并且它没有运行(通过任务管理器)。然后尝试在资源管理器中手动移动该文件(这将验证当前登录的用户是否有权移动文件)。

    Best Regards,

    Jeanine Zhang

          您好,感激你的答复!

          C:\\1,首先这个文件夹是没有任何程序占用的,只是里面存储的文件比较多,而且是可以移动的,这个可以肯定的

          1.C:\\1,文件夹占用2G大小调用MoveFileEx 是可以调用成功的

          2.C:\\1,文件夹占用7G大小调用MoveFileEx 是可以调用失败,返回0x5

            

    2019年7月26日 6:56
  • 你好,

    我尝试使用代码移动大小超过10G的文件夹,没有出现错误码5,拒绝访问。我认为使用MoveFileEx移动文件夹,对文件夹的大小没有限制。我建议你检查文件夹中的内容,是否有是其中的个别文件没有足够的目标目录权限。你是否使用管理模式下运行。

    Best Regards,

    Jeanine Zhang

    2019年7月26日 9:51
    版主
  • 你好,

    我尝试使用代码移动大小超过10G的文件夹,没有出现错误码5,拒绝访问。我认为使用MoveFileEx移动文件夹,对文件夹的大小没有限制。我建议你检查文件夹中的内容,是否有是其中的个别文件没有足够的目标目录权限。你是否使用管理模式下运行。

    Best Regards,

    Jeanine Zhang

         您好,

         首先很感激你的尝试,但是有可能大家的测试条件不同,你试试我下面的建议

        1.测试的文件夹,每个文件大概2M左右,文件数量直到它满足9G 以上的容量,然后你再调用MoveFileEx将文件夹进行重名试试吧

    2019年7月31日 1:43
  • 你好,

    根据你的要求,将测试文件夹中的单个文件保持在2M左右,文件夹大小满足9G以上的容量。然后调用MoveFileEx函数,依然成功。

    出现错误5是拒绝访问,在以下情况可能会发生:
    1,您无权在目标目录中写入
    2,您无权覆盖目标目录中具有相同名称的现有文件。

    我认为使用MoveFileEx移动文件夹,对文件夹的大小,文件夹中储存文件数量没有限制。

    Best Regards,

    Jeanine Zhang

    2019年7月31日 5:51
    版主
  • 你好,

    根据你的要求,将测试文件夹中的单个文件保持在2M左右,文件夹大小满足9G以上的容量。然后调用MoveFileEx函数,依然成功。

    出现错误5是拒绝访问,在以下情况可能会发生:
    1,您无权在目标目录中写入
    2,您无权覆盖目标目录中具有相同名称的现有文件。

    我认为使用MoveFileEx移动文件夹,对文件夹的大小,文件夹中储存文件数量没有限制。

    Best Regards,

    Jeanine Zhang

    谢谢,我的代码是这样的,但是的确出现了返回值为5的情况,而且是很多用户都出现了,

    wstring szPath(L"D:\\1"), szOut(L"D:\\2");
    bool blRet = MoveFileEx(
    szPath.c_str(), 
    szOut.c_str(), 
    MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH) ? true : false;
    if (false == blRet)
    {
    DWORD nErr = ::GetLastError();

    }

    请问你的代码是如何调用呢?

    2019年8月1日 3:32
  • 你好,

    这是我的代码:

    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    
    
    bool blRet = MoveFileEx("D:\\test2", "D:\\10", MOVEFILE_COPY_ALLOWED | MOVEFILE_WRITE_THROUGH) ;
    
    int main()
    {
    	if (!blRet)
    	{
    		printf("err is : %d ", GetLastError() );
    		return (0);
    	}
    	else
    		printf(TEXT("MoveFileEx succeed"));
    	return (0);
    }

    运行结果如图所示:

    其中文件夹test2的属性如图所示:

    Best Regards,

    Jeanine Zhang

    • 已标记为答案 Neko_NoW 2019年8月1日 6:05
    2019年8月1日 5:43
    版主