论坛首页 编程语言技术论坛

C# 文件操作问题

浏览 4586 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-13  
两个路径,路径1是复制后保存的路径,路径2是原始文件保存路径.
读路径2下的文件A,如果路径1下已经有文件A,则先删除路径1下的文件A,然后从路径2下拷贝文件A到路径1下,
没有,则直接从路径2下拷贝文件A到路径1下.如此反复.如果读文件C时出错,则原来删除或拷贝的文件都要复原.即:路径1,路径2下的文件保持在执行所有操作之前的状态.
就跟数据处理的事务差不多,出错了就ROLLBACK.

怎么实现?请高手们指点,先谢过了!!!
   发表时间:2007-07-15  
cp -f /path/to/file2 /path/to/file1
0 请登录后投票
   发表时间:2007-07-15  
liulc 写道
如此反复.如果读文件C时出错,则原来删除或拷贝的文件都要复原.即:路径1,路径2下的文件保持在执行所有操作之前的状态.就跟数据处理的事务差不多,出错了就ROLLBACK.


看看我理解的对不对,假如拷贝的文件很多,要花上半个小时,15分钟后电源断了,或者用户中断程序执行了,那么所有的文件都要恢复到拷贝之前的状态。(Transaction Rollback)

二楼的方法不行吧,cp执行了一半电源断了已经拷贝的文件还能自动rollback?

这可是个很高级的需求了。最简单的实现方法要求操作系统支持File System Transactions,据我所知,在Windows,Mac,Linux,FreeBSD这些主流OS里面只有Windows Vista和下个版本的Windows Server Longhorn支持这个。(很久没有更新OS知识了,说错了请指正。)

Vista和Longhorn支持这些API:

CreateFileTransacted
CopyFileTransacted
MoveFileTransacted
DeleteFileTransacted
CreatedHardLinkTransacted
CreateSymbolicLinkTransacted
CreateDirectoryTransacted
RemovedDirectoryTransacted


MSDN Magazine有篇文章,可以看看:http://msdn.microsoft.com/msdnmag/issues/07/07/NTFS/default.aspx

想想看啊,Windows Update在更新系统,更新了上百个系统文件了,忽然断电了,得,Windows就死了。所以这个feature很重要。

如果没有只为Vista写程序这么好运,那么唯一的方法是自己实现two-phase-commit protocol了。这不是一个容易的事,可以去翻翻数据库实现的书。

我以前有个项目,就是因为自己实现two-phase-commit protocol的代价太大,所有的东西都放到数据库去了。
1 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics