快速建立预定大小的多个文件

chenshi999 2002-12-13 09:56:13
遇到一个软件,可以在10秒之内,建立一个目录,在目录下建立一系列的
以数字命名的文件,每个文件64M,总共超过10G文件。每个文件初始化为0字符,那位大哥知道其原理,能否提个醒,思路也可。最好能用普通的C++语言就可以实现。
此软件特征:2000下运行,短时间CPU能完全利用(98%),能用进度控件表示进度。每个文件都被初始化。进程优先级为标准,单线程
我的运行环境:PIII 866,256MB RAM,WIN2000Server
...全文
70 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenshi999 2003-01-16
  • 打赏
  • 举报
回复
楼上仁兄,有眉目?
可否传情与我?
icansaymyabc 2003-01-14
  • 打赏
  • 举报
回复
哈哈哈
chenshi999 2003-01-08
  • 打赏
  • 举报
回复
没有,就一个线程。哎,兄弟我在线等待,我现在在找黑客软件!!!
DoItFreely 2003-01-08
  • 打赏
  • 举报
回复
难道是……创建了N个线程同时都设置为实时级别一起下手?

哇,这样的程序好象比盐湖城的蝗虫还厉害哟~~~
chenshi999 2003-01-08
  • 打赏
  • 举报
回复
SetFilePointer,SetEndOfFile使用的确会清0的。建立一个文件或几个文件速度都能很快。我现在是想建立成百上千的文件,希望有很快的速度。根据我的观察,这个软件在建立上千个文件的时候,短时间内CPU的利用率达98%,
并一直持续到建立文件结束,没有驱动的影子。而我采取最高级别的进程优先级,CPU也只能占4%左右,并且运行一会儿就会受调度影响。反观那个软件,是狂占CPU,当然比较快了。还有这个软件在2000/NT中,如果失去管理员权限就和我写的一样慢了。
chenshi999 2003-01-08
  • 打赏
  • 举报
回复
韩国一家公司的IDR2016的硬盘录象。我对其的数据存储部分很感兴趣
wormie4evr 2003-01-08
  • 打赏
  • 举报
回复
那个软件叫什么?
In355Hz 2003-01-07
  • 打赏
  • 举报
回复
恩?我用 SetEndOfFile 发现没有清 0,然后自己又手工去清~

我的系统是 Win98,可能和 NT/2000 表现不一样

如果 SetEndOfFile 自动清的话,估计 FILE_FLAG_NO_BUFFERING 要去掉,手工清零如果用这个标志,速度减慢很多~
wormie4evr 2003-01-07
  • 打赏
  • 举报
回复
In355Hz 你用 ntfs 的吗? 那倒有可能 1 秒内建 1G 空文件.
wormie4evr 2003-01-07
  • 打赏
  • 举报
回复
In355Hz: SetEndOfFile 自动清零的.
希望不要夸张, 你的代码 64M 要 2 秒.

chenshi999 你还有什么问题? 用 mmf 或 In355Hz 的方法都是理论上最快的用户级码, *不可能* 比那个软件慢.
chenshi999 2003-01-06
  • 打赏
  • 举报
回复
非常感谢各位大大的热心帮助。但是以上的各种方法我都试过。建立一个或很少的文件,都很快。但是在一段时间里,建立多个文件时,系统会更换时间片。现在的问题点是如何防止CONTEXT SWITCH,在认为没完成前,占有CPU的绝大部分工作时间。
chenshi999 2003-01-06
  • 打赏
  • 举报
回复
这个办法我也用过,速度不能有多大变化,运行一小会儿,系统的优先
等级就体现不出来。
In355Hz 2003-01-06
  • 打赏
  • 举报
回复
可以暂时动态提高进程/线程的优先级,参考 SetPriorityClass 和SetThreadPriority 两个函数:

Thread\Process: Idle Below Normal Above High Realtime
Critical 15 15 15 15 15 31
Highest 6 8 10 12 15 26
Above 5 7 9 11 14 25
Normal 4 6 8 10 13 24
Below 3 5 7 9 12 23
Lowest 2 4 6 8 11 22
Idle 1 1 1 1 1 16
比如用以下代码暂时调整线程优先级为24:

SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

... // 写文件

SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);

In355Hz 2003-01-05
  • 打赏
  • 举报
回复
建立文件可以很快,CreateFile + SetFilePointer + SetEndOfFile, 1G 的文件都 <1s,关键是清零,我试验的代码很简单 CreateFile + loop WriteFile,用一个 ZeroMemory 过的 Buffer 写入,用于 WriteFile 的 Buffer 越大,速度就越快,BufferSize = 64k 的时候就相当快了 (<1s)。

CreateFile + SetFilePointer + SetEndOfFile 的代码(去掉了错误处理):
const DWORD dwFileSize = (DWORD)0x4000000;

HANDLE hFile = CreateFile(TEXT("F:\\Data.bin"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
SetFilePointer(hFile, dwFileSize, NULL, FILE_BEGIN);
SetEndOfFile(hFile);
CloseHandle(hFile);

CreateFile + loop WriteFile 的代码:
const DWORD dwBufferSize = (DWORD)0x10000;
const DWORD dwFileSize = (DWORD)0x4000000;

HANDLE hFile = CreateFile(TEXT("F:\\Data.bin"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

LPVOID pvBuffer = new BYTE[dwBufferSize];
ZeroMemory(pvBuffer, (DWORD)dwBufferSize);
for (int i = 0; i < dwFileSize; i += dwBufferSize)
{
DWORD dwBytesToWriten = 0;
WriteFile(hFile, pvBuffer, dwBufferSize, &dwBytesToWriten, NULL);
}

delete[] pvBuffer;
CloseHandle(hFile);


wormie4evr 2003-01-04
  • 打赏
  • 举报
回复
搞笑? CreateFile怎么行.
在当前目录生成 64M 的 a.dat: (看看是不是比那个软件慢 :-)
HANDLE hfile = CreateFile("a.dat", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hmm = CreateFileMapping(hfile, NULL, PAGE_READWRITE, 0, 0x4000000, NULL);
CloseHandle(hmm);
CloseHandle(hfile);
chenshi999 2003-01-03
  • 打赏
  • 举报
回复
产生文件这些都能实现,关键是速度和CPU的短时间高效独占利用!
Hawk_lp 2002-12-31
  • 打赏
  • 举报
回复
具体的细节没写!

在网吧,没法帖代码!!!!!!!!!!!!!!!!



Hawk_lp 2002-12-31
  • 打赏
  • 举报
回复
CreateFile()可以制定文件名

CString str;
for(int i = 0; i < 100 ; i++){
str.format("%d", i);
CreateFile(str,...)//以str为文件名,以CreateDirectory文件所在的文件夹
}
Hawk_lp 2002-12-31
  • 打赏
  • 举报
回复
1 建立文件夹 CreateDirectory() 有SDK函数的
2 CreateFile()放在循环中,一次在文件夹中创建多个文件,可以制定大小,
也可以先为空,后用WriteFile()将每一个文件写到64M
chenshi999 2002-12-19
  • 打赏
  • 举报
回复
真希望有朋友给我指一条光明之路,哪怕是一条思路也行!
我初步分析此软件是:
1.运行级别极高,但没有任何驱动的影子,只有一个20K大小的DLL.
2.对硬盘进行直接读写.或许只是在FAT分区做标志.
但如何取得在应用程序中取得RING0般的级别,望高手们多多指点
加载更多回复(5)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧