int nCount=pArrayList.GetCount();//pArrayList存的文件内修改位置和要改的内容
file.Open(path, CFile::modeReadWrite);//读写模式打开文件
for (int i=0;i<nCount;i++)//循环对整个文件的标记位置替换
{
int nPos= pArrayList[i].nStartPos;
file.Seek(nPos, CFile::begin);
CString strWriText=pArrayList[i].strTrac;
file.WriteString(strWriText);//A
}
file.Close();//B
}
上面一段代码,请教A处的WriteString是写的内存还是写的硬盘,担心for循环对硬盘的频繁写操作。另外,是不是B处的Close才真正将已经更改好的内存中的文件写到硬盘???
WriteString从你的程序的角度看是写硬盘,但是操作系统甚至硬盘本身都有缓存机制(一块1TB的机械硬盘,通常有64MB的缓存,而操作系统甚至可以用1GB或者更多的可用内存充当缓存,当你读写文件的时候,这些缓存会使得读写尽可能少,缓存的运作机制是对程序来说透明的,你只是感觉硬盘操作更快),在相当程度上缓解了频繁写操作对性能的影响,而且对于现在的固态硬盘,小文件的读写性能已经比机械硬盘好太多了。
B处的Close才真正将已经更改好的内存中的文件写到硬盘
因为缓存的存在,这不一定,Close只是关闭文件句柄。如果你希望验证这一点,那么向硬盘写入10GB的数据(超过你的物理内存的上限,这时缓存就肯定失效了)。然后在Close后面加上一个MessageBox,你可以看到程序运行到了Close,把你的耳朵靠近硬盘。你会发现,Close之后,硬盘还在响
Dear Caozhy
明白您的意思,也就是说程序本身的write就是往硬盘频繁写,但是因为硬盘缓存或者系统的虚拟内存的存在,实际没有真正读写物理硬盘。我是不是还可以这样理解:即使频繁open WriteString close一个文件,也可能是频繁在操作缓存内的数据,而没有真正操作物理硬盘,但是即使这样也会有一些延迟对吗?
能否再解释下,::open的作用?把数据从硬盘读到内存?还是其他什么?
另外,个人感觉open WriteString close 类似word打开占用一个文件,然后编辑,然后保存。编辑时都在内存操作,只有在最后保存时才写硬盘,这样类比的话,WriteString不应该是写硬盘的啊?