复制 Windows 的系统文件 (c:\windows\system32) 时发生意外情况

Something unexpected happened copying system files for Windows (c:\windows\system32)

提问人:hahaha1144 提问时间:10/8/2023 更新时间:10/11/2023 访问量:101

问:

    #define FILE_NAME_MAX_SIZE 512 
    #define buf_len 5   
std::string szFileData;
char file_name[FILE_NAME_MAX_SIZE + 1] = {0};
char databuf[buf_len + 1] = {0};
//printf("------------------\nEnter the file name to transfer:\n");
//scanf("%s",&file_name);
//printf("------------------\n");
int i = 1, unReadLen = 0;
int count = 0;
//----------------------------------------- 
 
FILE* fp = fopen("C:\\Windows\\System32\\calc.exe", "rb");
FILE*fp2 = fopen("C:\\Users\\OS\\Desktop\\aa.exe", "wb");
//------------------------------------------
if (fp == NULL)
{
    printf("File:%s Not Found!", file_name);
}


else 
       {
    while (1) 
                    {
            fseek(fp, unReadLen, SEEK_SET);
            count = fread(databuf,1, buf_len, fp);                                  
            unReadLen += count *1;  

            printf("count:%d\n", count);
            printf("unReadLen:%d\n", unReadLen);
            printf("%d:%s\n", i++, databuf);

            fwrite(databuf, 1, count, fp2);
            szFileData.append(databuf);

            memset(databuf, 0, sizeof(databuf));
           if (count < buf_len) 
           {
            printf("end\n"); fclose(fp); fclose(fp2); break; 
           }
           }
  }

当您将文件从系统目录复制到桌面时,文件大小会发生变化,但复制的文件会在此处输入图像描述

使用 cmd 对文件大小相同的文件执行复制命令,在此处输入图像描述

C++ C Windows Visual Studio 文件

评论

1赞 Sam Varshavchik 10/8/2023
流行测验:如何知道要附加到多少个字符(其最终大小与实际文件的差异显然是您要问的)。一旦你做了研究,并弄清楚了如何神奇地知道要附加多少个字符,你就会同时弄清楚这个史酷比之谜!(意识到复制的二进制文件中有很多字节也会非常有帮助)。szFileData.append(databuf);databufszFileDataappend()std::string00
0赞 Joshua 10/8/2023
@SamVarshavchik:没问题。没有任何东西查看 szFileData。
1赞 Sam Varshavchik 10/8/2023
一个友好的赌注,@Joshua,就是这样。显示的代码不是一个最小的可重现示例,您可以完全按照所示进行剪切/粘贴、编译、运行和据称重现该问题。这不是真正的代码,而是更改的代码,没有,等等......真正的代码几乎肯定会有一些东西可以转储大小为 的东西,或者类似的东西。无论如何,这不会做提问者认为它会做的事情。mainszFileDataappend()
1赞 273K 10/8/2023
为什么要用 C 标记 C++ 代码?
1赞 Minxin Yu - MSFT 10/10/2023
@hahaha1144 您使用的是 x86 项目还是 x64 项目?

答:

1赞 Joshua #1

这段代码很狡猾:

           if (count < buf_len) 

替换为

           if (count <= 0) 

您可能会无缘无故地阅读简短的内容。

我怀疑这不是实际问题,但应该首先解决这个问题,以将其作为可能的问题从分析中解脱出来。

评论

0赞 Sam Varshavchik 10/8/2023
您不会从普通文件中获得简短的读取。尤其是在使用 .不对。fread()
1赞 Joshua 10/8/2023
@SamVarshavchik:我有。他有一个奇怪的缓冲区大小,也更有可能。
1赞 hahaha1144 10/11/2023 #2

发现原因是Windows 64位系统文件重定向引起的