首页
社区
课程
招聘
[旧帖] 求助,如何创建一个连续的文件 0.00雪花
发表于: 2010-1-27 10:03 8019

[旧帖] 求助,如何创建一个连续的文件 0.00雪花

2010-1-27 10:03
8019
各位高手,小弟碰到一个问题,想请教一下各位。

最近一个项目里,想在一个卷分区里创建一个连续的文件,然后计算该文件对硬盘的偏移量,通过直接写硬盘的方式写文件。
但是如果用ZwCreateFile通过文件系统创建的话,不一定能保证整个文件在物理上是连续的,这样就没有办法通过硬盘的偏移量直接写文件了。

我想请教一下有没有办法能够直接创建一个物理连续的文件。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (30)
雪    币: 351
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
LZ可以看看这个贴http://topic.csdn.net/u/20090618/17/429d0f53-7151-4c49-9cf6-72b986223c28.html    不过他是讨论在linux下的,不知对lz是否有用
2010-1-27 11:26
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
3
Mark~  关注!
2010-1-27 12:06
0
雪    币: 156
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
貌似Windows的API不能提供这样的功能……

我觉得可以直接读写NTFS表,寻找到连续的磁盘空间,然后手动建立文件,这样可以保证文件在物理上连续。

不过我只研究过FAT的文件分配表,至于NTFS格式下怎么处理我就不知道了……有待于研究~
2010-1-27 12:38
0
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主这样做是要实现什么,或者是达到什么效果呢?个人认为,磁盘在格式化的时候,分配扇区的时候,物理上就不是连续的,而且这样的文件是很难维护的。FAT和NTFS的要分开处理,fat文件系统,就得读fat表,要自己寻找fat表中标记为00的连续簇,而且得计算你要存的文件需占用的簇数,比较后再存文件。NTFS文件系统在分配空间的时候,就更加复杂了。
2010-1-27 13:33
0
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
http://u.115.com/file/f34b9699a8
这个链接是《NTFS文件系统的主要数据结构》你去参考一下吧。
2010-1-27 13:47
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
7
有,二、三十年前,有一種硬件叫做“tape”,這種 storage 可以滿足 lxcsyh 的要求。


若在 foramt 當下不寫入任何 data, diskette  當然是一个物理连续的 space.

還有第三種情況,若 data zise < 物理上连续的 space size,那也可以滿足 lxcsyh 的要求。

為什麼 lxcsyh 的問題這樣困難?
其實很容易理解,因為現在的 files access 都是採用 “ random access file ”模式。
2010-1-27 14:27
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
呵呵,谢谢wuzhidao, 不过貌似windows和linux差别比较大。
2010-1-27 16:30
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢落寒,不过这样的方法貌似难度比较大,项目时间可能不够。
不过还是要感谢。
2010-1-27 16:32
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
一起学习,不过问一下,即使写在连续的区域上,一旦拷贝过后,也无法保证文件还是连续的了

除非lz,是要做备份,备份到其它磁盘,不过这样生成的文件本身就是连续的了吧
2010-1-27 16:40
0
雪    币: 131
活跃值: (10)
能力值: ( 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
2010-1-27 17:00
0
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
所以个人认为楼主的需求是不太客观的,也是很难实现的。
2010-1-27 17:03
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
13
是的。
這樣理解是沒錯。
不過,當 diskette 為 一個 empty storage 時,可以達成 logical mapping physical 為完美的连续情況,這樣的理論可以實現。
估且不考慮 motor 的  speed rate 為何,對於 read / write 時,真正要注意的是在 INT 25h/INT 26h 的控制。為了要達到 "连续性",performance  多少會被拉下來地。
2010-1-27 19:39
0
雪    币: 131
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
支持13楼的观点,我也觉得要达到连续性,性能会被拉下来很多。
2010-1-28 08:36
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
多谢各位的各种中肯的意见,小弟在此谢过。
其实我是想实现一个驱动,在卷分区里面开辟一块空间来记录卷的bitmap信息。
因为卷分区的内容随时都在变化,所以我的驱动必须实时修改这块空间以记录变化。
因为修改的时候是直接写disk,不通过file system,所以必须要求这块区域是连续的。
2010-1-28 09:52
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
稍微补充一下,创建这块空间的时候我想通过file system创建, 因为如果不通过file system创建的话,
NTFS也就不知道这块区域已经被占用了。
这样的话就会出现显示的分区大小和实际可用的分区大小不匹配,或者更严重的是这块区域被NTFS覆盖掉。
除非手动修改分区NTFS头的信息,这样难度会非常大。
2010-1-28 11:02
0
雪    币: 2096
活跃值: (100)
能力值: (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)
2010-1-28 11:07
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
呵呵,不好意思rockinuk大大,我只是做个假设。
比如先通过file system来获取分区的信息,知道哪里是empty,哪里有足够的连续空间。
然后分配空间的时候不通过file system分配。
但是这样的话就会出现我前面提到的几个问题。
2010-1-28 11:15
0
雪    币: 2096
活跃值: (100)
能力值: (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.
2010-1-28 11:26
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
我晕, 刚刚看到, 我的现金只有1 Kx,  可是我发表的时候居然可以设置悬赏100 Kx.......
我给不了这么多啊....

不好意思,我不是故意忽悠大家的,确实没有看清楚。
没有money,只能结贴了,不好意思打扰各位了。
2010-1-28 11:29
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
还是谢谢rockinuk大大的方案, 不过和我的需求还是有些出入。
我是想驱动初始化的时候就建立这个连续的空间,然后实时修改这块空间的信息。
2010-1-28 11:33
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
22
那就是 Format 了。
然後自己做 I/O.
2010-1-28 11:49
0
雪    币: 2096
活跃值: (100)
能力值: (RANK:420 )
在线值:
发帖
回帖
粉丝
23
應該是你發帖時,點數就已經先扣除了。
2010-1-28 11:50
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
就是说刚Format以后,调用ZwCreateFile来创建的文件可以保证是连续的,是这个意思吗?
2010-1-28 12:22
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
哈哈,原来是这样啊,但就没问题了。
不过我的金钱怎么一直都保持在1 Kx不涨呢? 奇怪了
2010-1-28 12:23
0
游客
登录 | 注册 方可回帖
返回
//