代码之家  ›  专栏  ›  技术社区  ›  binarybob

预先编程确定文件“磁盘大小”

  •  2
  • binarybob  · 技术社区  · 16 年前

    在我写之前,我需要知道一个给定的内存缓冲区作为一个磁盘上的(U盘)文件有多大。我知道,除非大小落在块大小的边界上,否则很可能会被取整,例如,一个1字节的文件在磁盘上占用4096字节。我正在使用 获取磁盘释放空间() 要计算出磁盘块大小,请使用此计算磁盘上的大小,如下所示:

    GetDiskFreeSpace(szDrive, &dwSectorsPerCluster, 
                     &dwBytesPerSector, NULL, NULL);
    
    dwBlockSize = dwSectorsPerCuster * dwBytesPerSector;
    
    if (dwInMemorySize % dwBlockSize != 0)
    {
        dwSizeOnDisk = ((dwInMemorySize / dwBlockSize) * dwBlockSize) + dwBlockSize;
    }
    else
    {
        dwSizeOnDisk = dwInMemorySize;
    }
    

    看起来效果不错, 但是 获取磁盘释放空间() 根据msdn,只能在2GB以下的磁盘上工作。 getdiskfreespaceex()。 不返回相同的信息,所以我的问题是,我如何才能为驱动器>2GB计算此信息?有我错过的API调用吗?我可以根据总磁盘大小假设一些硬值吗?

    4 回复  |  直到 10 年前
        1
  •  3
  •   snowcrash09    16 年前

    msdn仅声明 GetDiskFreeSpace() 函数无法报告 体积大小 大于2GB。它可以很好地检索每个集群的扇区和每个扇区的字节,我自己也用它来查找非常相似的代码;-)

    但是如果您也想要磁盘容量,您需要额外的呼叫 GetDiskFreeSpaceEx() .

        2
  •  3
  •   MSalters    10 年前

    磁盘上文件的大小是一个模糊的概念。在NTFS中,文件由一组数据元素组成。你首先想到的是“未命名的数据流”。这是一个文件的属性,如果小的话,它可以与目录条目中的其他属性打包在一起。 Apparently ,您可以在目录条目本身存储高达700-800字节的数据流。因此,假设的1字节文件将大到0字节或700字节文件。

    另一个影响是文件压缩。这将使磁盘上的大小可能小于内存中的大小。

        3
  •  1
  •   ROAR    16 年前

    您应该能够使用deviceiocontrol函数获取此信息,并且
    磁盘几何结构。它将返回一个包含您正在查找的信息的结构。

    http://msdn.microsoft.com/en-us/library/aa363216(VS.85).aspx

    http://msdn.microsoft.com/en-us/library/ms809010.aspx

        4
  •  -3
  •   karthick    15 年前

    在ActionScript中!

    var size:Number = 19912;
    var sizeOnDisk:Number = size;
    var reminder:Number = size % (1024 * 4);
    if(reminder>0){
        sizeOnDisk = size + ((1024 * 4)- reminder)
    }
    trace(size)
    trace(sizeOnDisk)