【发布时间】:2015-11-16 16:41:09
【问题描述】:
我应该得到多个具有相同扩展名的文件(例如,一个分成多个档案的档案:rar、r00、r01 等)。
我正在尝试找到一种解决方案,如果我获得的文件流之一无法写入,则之前创建的所有成功文件都将被删除。 就像事务性文件流编写器一样。
我遇到了.NET Transactional File Manager 项目,这似乎正是我所需要的——除了它不适用于流,而是适用于文件路径。
此时我只看到两个选项:
- 保留成功文件写入的列表,如果其他文件写入失败,我将检查该列表并全部删除。
- 通过 FileStream 将所有文件写入 %TEMP% 或其他文件,然后 - 成功写入所有文件后,我将使用事务文件管理器(如上所述)将文件移动到所需位置。
需要注意我必须使用流
您认为这两个选项中哪个更好? 这样做有没有更好的建议或想法?
谢谢
编辑:
【问题讨论】:
-
你浏览过事务文件管理器的源代码吗?它实际上首先使用 File.Copy 将原始文件复制到 %TEMP%,然后对原始文件(AppendAllText、WriteAllBytes 等)进行操作。当您调用 RollBack 时,它只是将 %TEMP% 处的文件复制回其原始位置。就像您在选项 2 中计划的那样。
-
我认为最好的选择是在 %TEMP% 下创建一个具有唯一名称(timestamp + newguid 可以)的目录,然后将所有文件写入该目录下。如果所有文件操作都成功,(并且流被处理、关闭)将目录移动到它的最终位置。如果任何文件失败(并且流已被释放、关闭),请使用 Directory.Delete 删除目录
-
请尝试一些东西。您的问题“过于宽泛”或“主要基于意见”,具体取决于您在答案中寻找多少细节。您将了解很多关于您看到的任何一个选项是否适合您,如果是的话,哪一个看起来最适合您的场景。如果在解决此问题的过程中遇到特定问题,请随时通过a good, minimal, complete code example 发布问题,该问题可靠地重现该问题,并准确解释该代码的作用和这与您想要的有何不同。
标签: c# file file-io transactions transactional