社区
网络及通讯开发
帖子详情
至今无人能解. 有什么办法可以让程序在瞬间建立一个大小为 800MB 的磁盘文件, 但是不写任何内容进去?
twgdh
2006-09-15 11:50:30
就想 NetAnts 等下载软件所做的那样?
...全文
669
19
打赏
收藏
至今无人能解. 有什么办法可以让程序在瞬间建立一个大小为 800MB 的磁盘文件, 但是不写任何内容进去?
就想 NetAnts 等下载软件所做的那样?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
土著巫师
2006-09-21
打赏
举报
回复
chsize可能为了兼容C,做了一些数据流缓冲上的处理,所以影响了速度,没找到源码。(WINDOWS平台上按理说也是调用SetFilePosition),因为lseek就是调用了这个函数。
土著巫师
2006-09-21
打赏
举报
回复
1、网络蚂蚁用的也是CreateFile + SetFilePosition。(在一个磁盘空间不足的盘符里存贮你要下载的大文件,它会报错,提示:SetFilePosition返回失败。(以前偶尔发现的)
2、TFileStream在建立文件和改变文件大小时也是用的CreateFile + SetFilePosition(有源码可查)
3、上面两者从你的测试数据上看也是可以佐证的。(没什么区别。)
4、chsize函数按说不会有这么大的差异。奇怪。:(
mango279
2006-09-21
打赏
举报
回复
boyla(土著巫师) ( ) 信誉:99 Blog 2006-9-21 13:36:46 得分: 1
去看看我的这个问题:
http://community.csdn.net/Expert/topic/5038/5038640.xml?temp=.8979914
「已注销」
2006-09-21
打赏
举报
回复
mark
netliuming
2006-09-21
打赏
举报
回复
mark!!!!!!!!
土著巫师
2006-09-21
打赏
举报
回复
TO mango279(木目):
Button1Click函数里的部分可以抽取独立出来的,只有一句:Memo1->Lines->Add(End-Begin);是BCB专有的东西,其余部分可以在VC或其它IDE环境编译里,不会有问题的。
mango279
2006-09-21
打赏
举报
回复
boyla(土著巫师) ( ) 信誉:99 Blog
--------------------------------------------
没用过BCB,不知道对不对。
但在这里祝贺你下岗9个月,解脱了,解脱即超脱。不知道我们这些俗人何时才能解脱!
土著巫师
2006-09-21
打赏
举报
回复
正解:
0、WINDOWS API SDK 函数不是SetFilePosition(错),是SetFilePointer(对)。
1、BCB在WINDOWS平台上的I/O,最终都是调用WINDOWS API SDK函数,比如建立文件用CreateFile,读取用ReadFile,写入用WriteFile,关闭文件用CloseHandle,包括文件移动、改变大小等等。(这就是做操作系统的优势,所以其它开发商注定要比M$矮一节)。
2、BCB/DELPHI里的ANSI C/C++ 等函数fopen,fwrite, fread以及其它如lseek(其本质就是调用SetFilePointer这个SDK函数)等等函数或VCL文件的I/O统统都不例外。
3、重点说一下chsize这个函数,这个函数可以实现的很快的,慢的原因是BORLAND具体实现时,它首先记录下利用SDK函数GetFileSize得到的文件原大小,如果文件是增大时,它在改变文件大小后,再把文件扩大部分调用WriteFile API函数全部写上0x00,而且每次调用只写入128个字节的0x00, 所以要调用N多次写入函数,加上磁盘输出本来就很慢,所以很慢就可想而知了 :( 而通过SDK扩大时,扩大部分的内容是不可知的。(随机数据,分配的扇区里原来是什么就是什么,删除其它文件时并没有把它占用扇区里的数据清零),所以相对就快很多。
4、其实建立或打开文件后想改变文件大小很简单,为什么前面有的朋友的做法是移动文件指针到某一位置后写入一点数据也很快呢。其实这些写入时调用了SDK的另一个关健函数:SetEndOfFile。
5、最快的解决方案:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE BigFile;
DWORD Begin, End;
Begin = GetTickCount();
BigFile = CreateFile("BigFile.bin", // 文件名
GENERIC_READ | GENERIC_WRITE, // 读、写操作
FILE_SHARE_READ | FILE_SHARE_WRITE, // 读、写共享
NULL, // 安全描述符:缺省
OPEN_ALWAYS, // 总是打开,没有则建立
FILE_ATTRIBUTE_NORMAL, // 文件属性:常规
NULL // 临时文件句柄:无
);
if(BigFile != INVALID_HANDLE_VALUE) // 打开或建立成功
{
if(SetFilePointer(BigFile, 800*1024*1024, NULL, FILE_BEGIN) != 0xFFFFFFFF)
{//文件指针移动成功
if(SetEndOfFile(BigFile)) // 设置文件结束符,这才是问题的本原。:):):)
{
End = GetTickCount();
Memo1->Lines->Add(End-Begin); // BCB6SP4/WIN2KSP4/PIII600/128M/4500RPM硬盘笔计本电脑: 80毫秒,YES!
}
}
CloseHandle(BigFile); //使用后关闭句柄
}
}
//---------------------------------------------------------------------------
以此纪念本人下岗9个月。:(
不知道这个解决方案可不可以“入精”。:)
BCB论坛里越来越少人气了。:(
mango279
2006-09-21
打赏
举报
回复
800M的文件,不写进内容,意味着里面的内容都是0。
但是无论用什么办法生成这个文件,系统都要保证再读出来的时候数据是0,因此系统的文件管理要在生成这个文件的时候在磁盘中写800M的0。
这和用什么函数没有关系。
cczlp
2006-09-16
打赏
举报
回复
我用的是
CreateFile然后
SetFilePointer
YJS050320001
2006-09-16
打赏
举报
回复
呵呵
iwenlove
2006-09-15
打赏
举报
回复
用setfilepoint()吧。你查下API函数,把文件的末尾标志移出去就可以了。呵呵。
柯本
2006-09-15
打赏
举报
回复
用低层的I/O试试:
#include <fcntl.h>
#include <io.h>
#include <sys\stat.h>
...
int handle;
handle = open("e:\\temp\\test.bin", O_CREAT|O_RDWR ,S_IREAD|S_IWRITE );
if (handle==NULL)
{
ShowMessage("error");
return;
}
chsize(handle, 1024*1024*800); //改文件大小
close(handle);
老之
2006-09-15
打赏
举报
回复
使用文件流创建文件,将指针移到末端,随便写入一个字节就可以了。
var a:TFileStream;
Buf:PChar;
begin
a := TFileStream.Create('d:\1.tmp',fmCreate);
a.Seek(1024*1024*1024,soFromEnd);
a.Write(Buf,1);
a.Free;
end;
LuoGD
2006-09-15
打赏
举报
回复
应该是对文件分配表操作!不太清楚,网上查找相关资料
jiangshx
2006-09-15
打赏
举报
回复
楼上诸位不是人,是神!
5招轻松清理C盘,
瞬间
腾出10GB空间
本文介绍五种有效清理C盘的方法:清理临时
文件
与缓存,卸载不常用
程序
,迁移大
文件
至其他分区,压缩系统及休眠
文件
,分析
磁盘
占用情况,并管理系统还原点。结合系统工具与第三方软件,帮助用户快速释放至少10GB
磁盘
空间,提升系统运行效率。
10招彻底清理C盘,电脑
瞬间
提速
本文介绍10种面向Windows系统的C盘深度清理方法,包括使用disk cleanup和存储感知清理临时
文件
、卸载冗余软件、转移大
文件
、压缩休眠
文件
、清理浏览器缓存、调整系统还原点、分析
磁盘
空间分布、迁移虚拟内存页面
文件
、重置WinSxS组件存储及
建立
定期维护计划,全面提升系统响应速度与
磁盘
利用率。
SQL Server
文件
组实战:IO性能优化与
磁盘
隔离指南
本文深入解析SQL Server
文件
组的物理-逻辑双层架构,阐明.mdf、.ndf和.ldf
文件
的分工与IO特性,重点阐述如何通过合理规划
文件
组、分离热数据与索引、绑定SSD
磁盘
实现IO性能提升,并揭示VLF碎片、锁阻塞、权限陷阱等生产环境常见问题。
内容
涵盖T-SQL创建规范、表与索引迁移实操、自动化监控及云环境适配策略,聚焦数据库IO瓶颈的根因分析与可落地优化方案。
Miniconda创建环境时报错?
磁盘
空间检查建议
在使用Miniconda创建环境时,即使命令正确也可能因
磁盘
空间不足而失败。特别是在云服务器或容器中,根分区或/tmp目录空间有限,解压过程易触发'No space left on device'错误。建议清理conda缓存、调整临时目录位置,并合理规划
磁盘
容量,避免因空间问题导致环境构建失败。
WinDirStat:三重视角洞悉
磁盘
空间,告别C盘爆红焦虑(附下载指南)
WinDirStat是一款轻量级开源
磁盘
分析工具,通过目录树列表、
文件
类型统计和Treemap树状图三重视角,直观呈现
磁盘
空间占用情况。支持精准定位大
文件
、识别隐藏空间杀手(如.hprof、缓存
文件
)、可视化分析
文件
分布,并提供安全清理、深度优化及预防措施等实战方案,适用于Windows系统
磁盘
管理与C盘空间治理。
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章