Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
Winapi NtQueryInformationFile(FileBothDirectoryInformation)间歇性地报告某些子目录的非零大小(EndOfFile/AllocationSize)_Winapi_Driver_Windows Kernel_Nt Native Api - Fatal编程技术网

Winapi NtQueryInformationFile(FileBothDirectoryInformation)间歇性地报告某些子目录的非零大小(EndOfFile/AllocationSize)

Winapi NtQueryInformationFile(FileBothDirectoryInformation)间歇性地报告某些子目录的非零大小(EndOfFile/AllocationSize),winapi,driver,windows-kernel,nt-native-api,Winapi,Driver,Windows Kernel,Nt Native Api,我有一个简单的实用程序,可以递归地扫描目录(使用NtQueryInformationFile(FileBothDirectoryInformation))并计算各种统计数据。它通常针对各种SMB共享(托管在Win12服务器上)执行 特别是它计算总字节数(使用文件\u目录\u信息::endofile字段) 通常情况下,所有子磁盘的大小都报告为0,但如果我在5秒内重新运行我的实用程序(自上次运行以来),则会报告某些子磁盘的大小为4096。如果我在重新运行实用程序之前数到5,一切都正常。这会导致不稳定

我有一个简单的实用程序,可以递归地扫描目录(使用
NtQueryInformationFile(FileBothDirectoryInformation)
)并计算各种统计数据。它通常针对各种SMB共享(托管在Win12服务器上)执行

特别是它计算
总字节数
(使用
文件\u目录\u信息::endofile
字段)

通常情况下,所有子磁盘的大小都报告为0,但如果我在5秒内重新运行我的实用程序(自上次运行以来),则会报告某些子磁盘的大小为4096。如果我在重新运行实用程序之前数到5,一切都正常。这会导致不稳定的结果和不必要的警报

所有受影响的DIR似乎都有相同的共同点——每一个:

  • 包含
    Thumbs.db
    文件
  • 或者是包含
    Thumbs.db
    文件的目录的父目录
    • 。。。但并非总是如此——有时父目录大小稳定为0
问题:

  • 为什么会发生这种情况,为什么是5秒
  • 如何避免这种情况?我是否应该始终将子目录视为“使用零字节”

  • p.S.
    FILE\u BOTH\u DIR\u INFORMATION::AllocationSize
    字段也会发生同样的情况。

    我认为SMB客户端正在对目录进行一些本地缓存,并使用“默认数据流”存储与缓存相关的信息,这就是您看到的


    我认为您应该忽略目录上的分配大小。

    什么是“默认数据流”?名为“:$DATA”的备用流?是的,它是。分配大小字段由未命名/默认数据流的大小决定。