Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在windows中查找超过4gb的正确文件大小 我使用这个C++代码来查找Windows中的一些文件的文件化(使用VisualStudio):_C++_Windows_Visual Studio_Winapi - Fatal编程技术网

在windows中查找超过4gb的正确文件大小 我使用这个C++代码来查找Windows中的一些文件的文件化(使用VisualStudio):

在windows中查找超过4gb的正确文件大小 我使用这个C++代码来查找Windows中的一些文件的文件化(使用VisualStudio):,c++,windows,visual-studio,winapi,C++,Windows,Visual Studio,Winapi,如果文件大于4gb,则这没有为我提供正确的文件大小。经过一些研究,我试着: (p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow); 当我读到nfilesizehigh和nfilesizelow分别是文件大小的64位值的32位时,如果文件大小值大于32位,我们将maxdword(在我的例子中是0xFFFFFF)乘以nfilesizehigh。第二个解决方案也不起作用,给了我比原来

如果文件大于4gb,则这没有为我提供正确的文件大小。经过一些研究,我试着:

(p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow); 
当我读到nfilesizehigh和nfilesizelow分别是文件大小的64位值的32位时,如果文件大小值大于32位,我们将maxdword(在我的例子中是0xFFFFFF)乘以nfilesizehigh。第二个解决方案也不起作用,给了我比原来更小的尺寸。我又试了一次:

ULONGLONG FileSize = (FindFileData.nFileSizeHigh * 4294967296) + FindFileData.nFileSizeLow;
它成功了。此外,我还使用了另一种解决方案来获得文件大小:

 ULONGLONG FileSize = FindFileData.nFileSizeHigh;
 FileSize <<= sizeof( FindFileData.nFileSizeHigh ) *8; 
 FileSize |= FindFileData.nFileSizeLow;
ULONGLONG FileSize=FindFileData.nFileSizeHigh;
文件大小
这不会给出正确的结果,因为MAXDWORD是错误的值

(p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow); 
这不起作用,因为在将类型强制转换为足以容纳该值的大小之前,要将+1添加到MAXDWORD

(FindFileData.nFileSizeHigh * 4294967296) + FindFileData.nFileSizeLow;
这是因为
4294967296
是64位类型

FileSize <<= sizeof( FindFileData.nFileSizeHigh ) *8; 
FileSize |= FindFileData.nFileSizeLow;
FileSize我会使用:

ULONGLONG FileSize = (static_cast<ULONGLONG>(FindFileData.nFileSizeHigh) <<
                      sizeof(FindFileData.nFileSizeLow) *8) |
                     FindFileData.nFileSizeLow;
您可能会得到错误的值,因为
MAXDWORD
比4GB小一个,所以您最终得到了错误的值[是的,它可能很接近,但它至少会有1个字节的错误,可能更多]。但是,由于我们处理的是32位值,它实际上变成:

 -p_findFileData->nFileSizeHigh + p_findFileData->nFileSizeLow;
因为
MAXDWORD
与-1相同(是的,它可能是一个无符号值,但如果以这种方式使值溢出,则其行为与负符号值相同)

这个函数在数学上是正确的,但由于它溢出了一个32位的值,所以不起作用

 (p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow);
所以你得到了
低部分+(0*高部分)
这当然是不正确的

对于cast,这将起作用:

 static_cast<ULONGLONG>(p_findFileData->nFileSizeHigh) * (MAXDWORD+1) +
 p_findFileData->nFileSizeLow;
static_cast(p_findFileData->nFileSizeHigh)*(MAXDWORD+1)+
p_findFileData->nFileSizeLow;

使用
ULARGE\u INTEGER
结构组合值,而不是尝试手动计算/移动值:

ULARGE_INTEGER ul;
ul.HighPart = p_findFileData->nFileSizeHigh;
ul.LowPart = p_findFileData->nFileSizeLow;
ULONGLONG FileSize = ul.QuadPart;

我有完全相同的问题,答案对于我的代码来说非常简单。只需将MAXDWORD强制转换为64位整数(例如uint64\u t)。这背后的解释可以在我收到的答案中找到。

谢谢你的回复。您还可以告诉我为什么在最后一段代码中将filesizehigh乘以8,为什么在第一段代码中MAXDWORD的大小是错误的?如果尺寸不对,应该是什么?如果可能的话请告诉我。MAXDWORD是4294967295。正确的值是4294967296。然而,MAXDWORD+1是0(如果在2s补码中),而不是4294967296。为了能够添加1,得到4294967296,你必须先把它转换成一个64位的值。需要你的解释性评论应该突出这个具有特殊魔力价值的问题。在我看来,将
FindFileData.nFileSizeHigh
转换为
ULONGLONG
,将其向左移动并添加
FindFileData.nFileSizeLow
更明智(也更容易理解),因为你不会在这里绕开魔法,你的魔法数字是8,32,都没有区别,或者2^32.有道理…非常感谢Thomas和Nik的输入,非常感谢您的详细回答。我很感激。我也有一些问题,比如:为什么我们要在不工作的变体中将filesizehigh乘以MAXDWORD或4gb?这背后的逻辑是什么?在第一段代码中,为什么要将文件大小高乘以8?
MAXDWORD
=(2^32)-1`[其中
^
=是的幂,而不是C的XOR符号],因此距离4GB只有一个。和
sizeof(FileSizeHigh)*8
是FileSizeHigh`(32)中的位数。左移(
我尝试了这个,但它不起作用:静态转换(p\u findFileData->nFileSizeHigh)*(MAXDWORD+1)+p\u findFileData->nFileSizeLow;您可能需要
(静态转换(MAXDWORD)+1)
来避免它变成
0
(这有点像汽车上的里程表,如果你跑了99999英里,下一次它会翻到00000英里——二进制中的所有里程表都是一样的。):)是的,昨天试过了,明白发生了什么。谢谢你的解释。
 (p_findFileData->nFileSizeHigh * (MAXDWORD+1)) + p_findFileData->nFileSizeLow);
 static_cast<ULONGLONG>(p_findFileData->nFileSizeHigh) * (MAXDWORD+1) +
 p_findFileData->nFileSizeLow;
ULARGE_INTEGER ul;
ul.HighPart = p_findFileData->nFileSizeHigh;
ul.LowPart = p_findFileData->nFileSizeLow;
ULONGLONG FileSize = ul.QuadPart;