能力值:
( LV2,RANK:10 )
2 楼
LZ可以看看这个贴http://topic.csdn.net/u/20090618/17/429d0f53-7151-4c49-9cf6-72b986223c28.html 不过他是讨论在linux下的,不知对lz是否有用
能力值:
( LV9,RANK:610 )
3 楼
Mark~ 关注!
能力值:
( LV3,RANK:20 )
4 楼
貌似Windows的API不能提供这样的功能……
我觉得可以直接读写NTFS表,寻找到连续的磁盘空间,然后手动建立文件,这样可以保证文件在物理上连续。
不过我只研究过FAT的文件分配表,至于NTFS格式下怎么处理我就不知道了……有待于研究~
能力值:
( LV2,RANK:10 )
5 楼
楼主这样做是要实现什么,或者是达到什么效果呢?个人认为,磁盘在格式化的时候,分配扇区的时候,物理上就不是连续的,而且这样的文件是很难维护的。FAT和NTFS的要分开处理,fat文件系统,就得读fat表,要自己寻找fat表中标记为00的连续簇,而且得计算你要存的文件需占用的簇数,比较后再存文件。NTFS文件系统在分配空间的时候,就更加复杂了。
能力值:
( LV2,RANK:10 )
6 楼
http://u.115.com/file/f34b9699a8
这个链接是《NTFS文件系统的主要数据结构》你去参考一下吧。
能力值:
(RANK:420 )
7 楼
有,二、三十年前,有一種硬件叫做“tape”,這種 storage 可以滿足 lxcsyh 的要求。
若在 foramt 當下不寫入任何 data, diskette 當然是一个物理连续的 space.
還有第三種情況,若 data zise < 物理上连续的 space size,那也可以滿足 lxcsyh 的要求。
為什麼 lxcsyh 的問題這樣困難?
其實很容易理解,因為現在的 files access 都是採用 “ random access file ”模式。
能力值:
( LV2,RANK:10 )
8 楼
呵呵,谢谢wuzhidao, 不过貌似windows和linux差别比较大。
能力值:
( LV2,RANK:10 )
9 楼
谢谢落寒,不过这样的方法貌似难度比较大,项目时间可能不够。
不过还是要感谢。
能力值:
( LV2,RANK:10 )
10 楼
一起学习,不过问一下,即使写在连续的区域上,一旦拷贝过后,也无法保证文件还是连续的了
除非lz,是要做备份,备份到其它磁盘,不过这样生成的文件本身就是连续的了吧
能力值:
( LV2,RANK:10 )
11 楼
格式化之后,磁盘的扇区编号是连续的,只是逻辑上连续。硬盘的转速是相当快的,如果物理上连续的话,读写处理速度会跟不上转速。
扇区为什么不按顺序编号?
例如:
每磁道有17个扇区的磁盘按2:l的交叉因子编号就是:l、lO、2、ll、3、12、4、l 3、5、14、6、15、7、16、8、17、9,而按3:l的交叉因子编号就是:l、7、13、2、8、14、3、9、15、4、lO、16、5、ll、17、6、12。当设置l:l的交叉因子时,如果硬盘控制器处理信息足够快,那么读出磁道上的全部扇区只要求旋转一周,但如果硬盘控制器的后处理动作没有这样快,磁盘所转的圈数就等于一个磁道上的扇区数,才能读出每个磁道上的全部数据;将交叉因子设定为2:l时,磁头要读出磁道上的全部数据,磁盘就只须转两圈;如果2:l的交叉因子仍不够慢,磁盘也需转一个磁道上的扇区数那么多的圈数,这时,可将交叉因子调整为3:1
能力值:
( LV2,RANK:10 )
12 楼
所以个人认为楼主的需求是不太客观的,也是很难实现的。
能力值:
(RANK:420 )
13 楼
是的。
這樣理解是沒錯。
不過,當 diskette 為 一個 empty storage 時,可以達成 logical mapping physical 為完美的连续情況,這樣的理論可以實現。
估且不考慮 motor 的 speed rate 為何,對於 read / write 時,真正要注意的是在 INT 25h/INT 26h 的控制。為了要達到 "连续性",performance 多少會被拉下來地。
能力值:
( LV2,RANK:10 )
14 楼
支持13楼的观点,我也觉得要达到连续性,性能会被拉下来很多。
能力值:
( LV2,RANK:10 )
15 楼
多谢各位的各种中肯的意见,小弟在此谢过。
其实我是想实现一个驱动,在卷分区里面开辟一块空间来记录卷的bitmap信息。
因为卷分区的内容随时都在变化,所以我的驱动必须实时修改这块空间以记录变化。
因为修改的时候是直接写disk,不通过file system,所以必须要求这块区域是连续的。
能力值:
( LV2,RANK:10 )
16 楼
稍微补充一下,创建这块空间的时候我想通过file system创建, 因为如果不通过file system创建的话,
NTFS也就不知道这块区域已经被占用了。
这样的话就会出现显示的分区大小和实际可用的分区大小不匹配,或者更严重的是这块区域被NTFS覆盖掉。
除非手动修改分区NTFS头的信息,这样难度会非常大。
能力值:
(RANK:420 )
17 楼
不通过file system
這樣會有一點點的矛盾。
不通過 file system 來配置空間(應該說透過 OS 來 allocate disk space),怎麼能知道哪裡是 empty!?
maybe lxcsyh 的意思是想自己處理 I/O ,而不用透過 OS 所提供的 I/O service。
透過 RAM 來回寫到 HardDisk 可能可以辦到。( not sure really)
能力值:
( LV2,RANK:10 )
18 楼
呵呵,不好意思rockinuk大大,我只是做个假设。
比如先通过file system来获取分区的信息,知道哪里是empty,哪里有足够的连续空间。
然后分配空间的时候不通过file system分配。
但是这样的话就会出现我前面提到的几个问题。
能力值:
(RANK:420 )
19 楼
你的問題可行。只是 speed rate 會降低,同時也會浪費 disk space。
最簡的方法如下:
A way:
1) Format hard disk 讓這個 disk 成為 empty.
2) 把所有要寫入 disk 的 data , load 到 memory 裡。
(因為 memory 是足够的连续空间)
3) 然後把 data 從 memory 存回 disk 中.
(這樣不就是连续性了!?)
B way:
1) 先尋找一個空間大小 N bytes (假設 size N)。
2) 判斷 data < N ?
3) 若是,則直接 write;若否,則跳回 1) 重新找一個 N.
能力值:
( LV2,RANK:10 )
20 楼
我晕, 刚刚看到, 我的现金只有1 Kx, 可是我发表的时候居然可以设置悬赏100 Kx.......
我给不了这么多啊....
不好意思,我不是故意忽悠大家的,确实没有看清楚。
没有money,只能结贴了,不好意思打扰各位了。
能力值:
( LV2,RANK:10 )
21 楼
还是谢谢rockinuk大大的方案, 不过和我的需求还是有些出入。
我是想驱动初始化的时候就建立这个连续的空间,然后实时修改这块空间的信息。
能力值:
(RANK:420 )
22 楼
那就是 Format 了。
然後自己做 I/O.
能力值:
(RANK:420 )
23 楼
應該是你發帖時,點數就已經先扣除了。
能力值:
( LV2,RANK:10 )
24 楼
就是说刚Format以后,调用ZwCreateFile来创建的文件可以保证是连续的,是这个意思吗?
能力值:
( LV2,RANK:10 )
25 楼
哈哈,原来是这样啊,但就没问题了。
不过我的金钱怎么一直都保持在1 Kx不涨呢? 奇怪了