[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [讨论]dir /od 果真是按照时间排序的么?

本帖最后由 namejm 于 2011-5-18 19:18 编辑

在dir的帮助信息中,对参数 /OD 的解释是: 按日期/时间(从先到后)
果真如此?
我们来做个试验:
  1. @echo off
  2. for /l %%i in (1,1,300) do cd.>%%i.txt
  3. dir /a-d /b /od *.txt
  4. pause
复制代码
结果截图:

谁能看出这些文件到底是按什么顺序排列的?
别问我
我也不知道

看了一下各位的回帖
貌似各个系统之间有所差别
补充一下我的测试环境:
WindowsXP_Pro_SP3,简体中文版

或许这是dir的一个bug
可能到了Win7下被修复了
一如N年前在XP_SP2下用 reg querry 查询含中文字符的字符串会被“吃掉”部分字符,到了XP_SP3下已经被修复了一样
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

54# fastslz
NTFS可以精确到100000毫秒以内
可能是描述性错误
NTFS的创建时间可以精确到0.000001毫秒

wmic的结果说明不了太多的问题
只能说明ntfs的文件是成批的flush的
而且wmic的CreationDate还出现了错误
在删除文件后重新创建该文件
该文件的CreationDate显示的还是上一次创建时间
测试代码如下:
  1. @echo off
  2. for /l %%i in (1,1,30) do echo.A>%%i.xxx
  3. Wmic Datafile Where "Extension='xxx' and Drive='d:' and Path='\\Test\\temp\\'" get CreationDate,name /format:htable:"sortby=CreationDate"> batfile.html
  4. del *.xxx
  5. for /l %%i in (1,1,30) do echo.A>%%i.xxx
  6. Wmic Datafile Where "Extension='xxx' and Drive='d:' and Path='\\Test\\temp\\'" get CreationDate,name /format:htable:"sortby=CreationDate">> batfile.html
  7. del *.xxx
  8. start batfile.html
复制代码
现在已经大致有了NTFS写入文件的轮廓
文件句柄的创建与关闭肯定是顺序的
文件首先写入到缓存(可能是内存或虚拟内存)中
缓存上的文件数据块受缓存管理器管理
无论NTFS、FAT32还是exFAT都是统一的缓存管理器
NTFS卷上的文件更新时需要先更新日志文件
以便于数据文件写入失败时可以继续或者撤销
在日志文件写入物理存储之前
数据文件被缓存管理器定义为不可写NO WRITE状态
而日志文件的写入时机是受缓存管理器约束的
为了提高IO性能
缓存管理器对数据文件和日志文件的管理是多线程并发的
而受到Windows核心对CPU资源的管理策略影响
并发线程的执行顺序有一定的随机性
所以数据文件的实际写入顺序存在一定的随机性
天的白色影子

TOP

NTFS 维基百科写的更全面一些
NTFS可以精确到100000毫秒以内(其实没那么精确)
+480取决于文件创建时系统当前设置的时区,而当前时区可以是动态的,如果这个文件拿到不同时区的电脑上,加减480值来获取相应当前系统时区的文件创建时间

TOP

用wmi获取的文件写入时间FAT32,exFAT可以精确到100毫秒以内,NTFS可以精确到100000毫秒以内,应该是这些信息决定了它的排列方式
我这里xp和Windows7排列方式一样的,所以不应该存在BUG
每台电脑排列方式不一样可以这样解释,比如用for创建300个文件奔3级CPU创建可能所需时间更长
  1. @echo off
  2. :测试方法放在不同文件系统的根目录下
  3. set adir=%~d0
  4. ver|find "5.1"&&set v=5.1
  5. ver|find "6.1"&&set v=6.1
  6. if defined v (
  7. md %adir%\%v%-Test 2>nul
  8. if not exist %adir%\%v%-Test\*.txt for /l %%i in (1,1,300) do cd.>%adir%\%v%-Test\%%i.txt
  9. )
  10. for %%i in (5.1,6.1) do (
  11. if exist %adir%\%%i-Test\*.txt (
  12. Wmic Datafile Where "Extension='txt' and Drive='%adir%' and path='\\%%i-Test\\'" get CreationDate,name>%%i-Test-%v%-wmi.txt
  13. dir /a-d /b /od    %adir%\%%i-Test\*.txt>%%i-Test-%v%-od.txt
  14. ))
复制代码
引用NTFS百度百科
对DOS略知一二的读者一定熟悉文件的各种属性:只读、隐藏、系统等。在NTFS文件系统中,这些属性都还存在,但有了很大不同。在这里,一切东西都是一种属性,就连文件内容也是一种属性。这些属性的列表不是固定的,可以随时增加,这也就是为什么你会在NTFS分区上看到文件有更多的属性.   
NTFS文件系统中的文件属性可以分成两种:常驻属性和非常驻属性,常驻属性直接保存在MFT中,像文件名和相关时间信息(例如创建时间、修改时间等)永远属于常驻属性,非常驻属性则保存在MFT之外,但会使用一种复杂的索引方式来进行指示。如果文件或文件夹小于1500字节(其实我们的电脑中有相当多这样大小的文件或文件夹),那么它们的所有属性,包括内容都会常驻在MFT中,而MFT是Windows一启动就会载入到内存中的,这样当你查看这些文件或文件夹时,其实它们的内容早已在缓存中了,自然大大提高了文件和文件夹的访问速度。

NTFS   20110524103722.675442+480  1.txt
FAT32 20110524103651.520000+***  1.txt
480包含了时区,表示相对于UTC的时差分钟数,中国是第八时区,相差480分钟

TOP

51# plp626
辞不达意
看不出跟上下文有什么关联
天的白色影子

TOP

fastlz说,wmi 。。。。

一针见血。。。

TOP

要想有结论看来要去专业硬件论坛咨询了!
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

48# zm900612


还有“推测”二字……
目前还无法证明:NTFS是否会导致文件的存储顺序随机化
SZDLite Security Lab

TOP

46# zm900612
已经试验证实文件逻辑存储顺序与文件系统有关
对一个磁盘分区先后格式化为NTFS、FAT32、exFAT三种FS格式
拷入以下脚本文件反复测试文件逻辑存储的偏移
结果发现在同一台PC上
NTFS总是具有明显的 ...
qzwqzw 发表于 2011-5-20 10:56

看来有结论了,嘿嘿

TOP

46# zm900612
已经试验证实文件逻辑存储顺序与文件系统有关
对一个磁盘分区先后格式化为NTFS、FAT32、exFAT三种FS格式
拷入以下脚本文件反复测试文件逻辑存储的偏移
结果发现在同一台PC上
NTFS总是具有明显的偏移
FAT32和exFAT则几乎没有
另外发现NTFS下文件写入的速度的明显快于FAT32/exFAT
推测正因为NTFS采取了更为高效的缓存机制
所以一方面导致文件读写性能大幅提升
另一方面导致文件的逻辑存储顺序随机化
  1. @echo off & setlocal EnableDelayedExpansion
  2. for /l %%i in (1,1,300) do echo.A>%%i.xxx
  3. set maxoffset=0
  4. set minoffset=0
  5. for /f %%f in ('dir /a-d /b /od *.xxx') do (
  6. set/p=%%f <nul
  7. set /a count+=1
  8. set /a offset=%%~nf-count
  9. if !offset! gtr !maxoffset! set maxoffset=!offset!
  10. if !offset! lss !minoffset! set minoffset=!offset!
  11. )
  12. echo.
  13. echo ----------- %minoffset% : %maxoffset% -----------------
  14. pause
  15. del *.xxx
复制代码
天的白色影子

TOP

45# Batcher


!!磁盘缓存...

TOP

44# qzwqzw


由于磁盘缓存的存在,我很好奇它到底是不是依次逐一写磁盘的。有没有详细的资料可供参考?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

42# michael8111
“比较”以及“理想”都是一个模糊的词
需要一个量化的指标来进行标定
可能需要一个脚本

另外修改时间确实是秒级
这是文件存储的数据结构所决定的
dir不可能会检查到低于秒级的单位
这种情况只可能是因为有足够的时间缓冲
文件得以按顺序逐一flush到磁盘中
所以dir才能按照创建顺序展示
天的白色影子

TOP

本帖最后由 mxxcgzxxx 于 2011-5-19 21:02 编辑

41# qzwqzw

我想了很久,比较倾向于41楼的说法
有可能是缓存造成的写入延时或别的什么顺序错误
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

但是如果“逻辑存储顺序”出现倒序 那就应该与IO无关了
我在磁盘没有显著IO任务,且IO性能“比较”好的情况下 做了100组实验数据 结果都是乱序
我贴出一部分 证明dir的顺序在“理想”的磁盘环境中也会是乱的:
  1. 80.txt
  2. 82.txt
  3. 81.txt
  4. 83.txt
  5. 86.txt
  6. 87.txt
  7. 84.txt
  8. 88.txt
  9. 85.txt
  10. 94.txt
  11. 92.txt
  12. 93.txt
  13. 91.txt
  14. 89.txt
  15. 90.txt
  16. 96.txt
  17. 97.txt
  18. 98.txt
  19. 100.txt
  20. 95.txt
  21. 99.txt
复制代码
另外:
ping -n 1 127.1>nul
这条命令的执行时间只有大约半秒
然而如果每隔这个时间间隔创建一个文件 那么dir的顺序就是标准的
也就是说 dir的修改时间应该比秒精确一点
SZDLite Security Lab

TOP

返回列表