1

我正在创建一个存储过程来使用 SQL Server 2008 R2 跟踪某些服务器文件夹的已用空间。对于特定目录,我遇到了一个有趣的问题。

当我运行时,EXEC master.dbo.xp_cmdshell 'dir "\\servername\e$\media\Google" /s /-C'我得到一个结果:

在此处输入图像描述

但是,当我为 dos 命令使用变量时
DECLARE @dir VARCHAR(255) = 'dir "\\servername\e$\media\Google" /s /-C' EXEC master.dbo.xp_cmdshell @dir

我得到不同的结果:

在此处输入图像描述

可以看到文件数相同,但使用的字节数不同。以下是包含文件的子目录的详细信息:

不使用变量:

在此处输入图像描述

使用@dir 变量:

在此处输入图像描述

您可以看到,尽管每个文件的大小似乎相同,但总大小却不同。

我还有其他带有 zip 文件的子目录没有出现这种行为。有没有人对可能导致这种情况的原因有任何想法?或者如何修复?

4

2 回答 2

2

如果人们在共享上添加、编辑或删除文件,则免费字节数总是不同的。

我尝试在我的测试机器上运行它,并且两次执行的结果相同。我正在使用带有 2014 CTP 的 Windows 7。

您确定没有更改总数的隐藏文件或系统文件吗?目录、索引等也占用空间但不显示。您没有为文件匹配指定通配符模式。

这是关于该主题的外行文章。

http://ask-leo.com/why_does_the_space_used_by_files_on_my_hard_drive_show_different_numbers_depending_on_how_i_look.html

如果您从 Windows 资源管理器中手动选择文件,您会得到相同的总数吗?

尝试仅指定 'dir *.zip /s'。这只会选择 zip 文件。请写回结果!

于 2014-06-25T20:01:43.273 回答
1

也许这不是您正在寻找的答案,但我希望它以某种方式对您有所帮助:)

我在第一个比较中注意到:

181661290 - 181644906 = 16384 / 2048 = 8

所以我想也许,由于某种原因,当你使用变量时,命令会计算子文件夹的“集群大小”(我猜是 2048 字节)......

但后来我注意到:

8131596 - 8119308 = 12288 / 2048 = 6

所以只有 6 个文件夹在其中添加了 2048 个字节,我不知道为什么。

然后你说:

有趣的是,所以当我只使用 *.zip 运行时,这两个结果相互匹配。

也许将开关 /ad (不显示文件夹)添加到命令行可以解决问题。

我正在添加sqlservercentral 的这篇文章,我发现它可能与问题有关:

CompressedBit AS CASE WHEN 属性&2048=2048 THEN 1 ELSE 0 END,

于 2014-06-30T14:34:26.803 回答