文件保存的实现逻辑策略

sinux_1983 2008-12-15 01:16:00
现在做的项目需要实现文件的保存行为,但是很地方还没有一个清晰的思路,请各位指点。

问题:
当执行【file】|【save】命令时,内部的执行逻辑是什么?
我是这样想的,首先将内存中的文件数据保存成一个临时文件,然后关闭当前文件,然后删除当前文件,然后将临时文件重命名为当前文件。然后重新加载这个文件。
问题是如果是这样的话,每次我们执行save操作,文件都得重新加载一次,在这种情况下,编辑状态等信息就会丢失,甚至编程窗口都要关掉重启。

另:网上有没有相关的详细介绍的资料,望大家推荐一下,中英文均可!
谢谢!
...全文
155 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinux_1983 2008-12-16
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cyblueboy83 的回复:]
不太明白楼主的意思
不过按照你的意思,打开一次,然后有需要就write进去,好像没什么问题,如果要实时反应到文件,可能要调用flush刷新缓冲区


[/Quote]
问题是我的文件加载部分和文件保存部分分别是用DLL形式实现的,接口限制,两个DLL之间,并没有文件句柄可以传递。
文件加载部分只接受文件名作为参数。文件保存部分也一样。
herman~~ 2008-12-15
  • 打赏
  • 举报
回复
不太明白楼主的意思
不过按照你的意思,打开一次,然后有需要就write进去,好像没什么问题,如果要实时反应到文件,可能要调用flush刷新缓冲区

sinux_1983 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zjfhgdx 的回复:]
读入一个文件,将文件的内容复制一份放入内存,并锁定那个文件.保存,将内存中的文件写入到文件中.
[/Quote]
保存,将内存中的文件写入到文件中.这期间是不是有一个文件替换的过程?这之后还需要重新读入这个文件吗?
babycathq2000 2008-12-15
  • 打赏
  • 举报
回复
1、打开文件时,获取文件句柄handle1;
2、通过handle1读取文件,并打印在编辑框中;
3、用户编辑修改编辑框中的内容;
4、保存文件时,读取编辑框中的内容,然后通过handle1写入文件。
5、另存文件时,首先关闭原文件句柄handle1,然后打开用户指向的新文件(如果不存在就创建,已存在就提示是否覆盖原内容),获取新文件句柄handle2,然后读取编辑框中的内容,通过handle2写入文件。
zjfhgdx 2008-12-15
  • 打赏
  • 举报
回复
应该是这样没错吧.
zjfhgdx 2008-12-15
  • 打赏
  • 举报
回复
读入一个文件,将文件的内容复制一份放入内存,并锁定那个文件.保存,将内存中的文件写入到文件中.
sinux_1983 2008-12-15
  • 打赏
  • 举报
回复
只有点击保存时才通过后台维护的文件句柄向文件做更新保存
rambo能否详细的说一下这个过程。
谢谢!
babycathq2000 2008-12-15
  • 打赏
  • 举报
回复
当然是通过文件句柄进行交互了。打开文件时就打开句柄,关闭文件时就关闭句柄,另存时就变换句柄。
babycathq2000 2008-12-15
  • 打赏
  • 举报
回复
说白了,当你打开一个文件并将文件内容显示在编辑框中时,后台只是维护一个文件句柄,就像2楼说的,前台编辑框的内容只是文件的一个副本,无论怎样修改,只有点击保存时才通过后台维护的文件句柄向文件做更新保存。所以,当点击另存时,如果编辑框的内容处于已修改但未保存的状态,那么首先要提示用户进行保存;而未修改,或者修改已保存的状态下,允许用户进行保存,但编辑框不需要关闭,只需要将后台的句柄改为指向新的文件(如果不存在就创建,已存在就提示是否覆盖原内容)即可。
sinux_1983 2008-12-15
  • 打赏
  • 举报
回复
问题是我太清楚内存中的这个数据区应该怎么与硬盘上的那个文件交互。
---------------------------------------------------------------
问题是我太清楚内存中的这个数据区应该怎么与硬盘上的那个文件交互。
sinux_1983 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 SearchLife 的回复:]
打开一个文件的时候,打开的其实是原文件的一个副本(好像WORD是这样子的);
所以当你修改这个文件的时候,其实修改的是这个副本;
当你保存时才会将这个副本修改的写入到这个文件(具体是只写入修改的部分还是全部覆盖就不清楚了)。

说错了,请大家改正。
[/Quote]
应该是有一个副本存在,但是,硬盘是不会有副本吧,我觉得,打开一个文件的时候,在内存中建立一个数据区(相当于文件的副本),修改是针对这个数据区的,只有保存时才对硬盘上的文件进行替换。问题是我太清楚内存中的这个数据区应该怎么与硬盘上的那个文件交互。
sinux_1983 2008-12-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 babycathq2000 的回复:]
编辑未保存状态下不允许另存。
另外,你另存后只是文件路径和句柄指向的另存文件,只需重新打开文件,重新设计句柄就行了,跟你的编辑框的内容没关系呀,为什么要关闭编辑框窗口?
[/Quote]
我主要不明白的是【保存】的内部实现流程
SearchLife 2008-12-15
  • 打赏
  • 举报
回复
打开一个文件的时候,打开的其实是原文件的一个副本(好像WORD是这样子的);
所以当你修改这个文件的时候,其实修改的是这个副本;
当你保存时才会将这个副本修改的写入到这个文件(具体是只写入修改的部分还是全部覆盖就不清楚了)。

说错了,请大家改正。
babycathq2000 2008-12-15
  • 打赏
  • 举报
回复
编辑未保存状态下不允许另存。
另外,你另存后只是文件路径和句柄指向的另存文件,只需重新打开文件,重新设计句柄就行了,跟你的编辑框的内容没关系呀,为什么要关闭编辑框窗口?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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