【问题标题】:How can I use Transaction in FILE OPERATIONS?如何在文件操作中使用事务?
【发布时间】:2012-05-30 05:22:10
【问题描述】:

我的程序需要将一些文件操作视为一个单元,一个案例中的一些重要步骤是:

  1. 删除目录中的文件。
  2. 验证一些数据。如果数据无效,回滚
  3. 将文件上传到目录。如果上传失败回滚
  4. 提交更改。

我对交易提出这个要求是因为有时用户可能使用VPN访问我的网站,VPN连接可能非常不稳定。

如果第三步失败,第一个文件和新上传的文件都会丢失。

我的一些代码:

        DeleteTheOlderDT(path, FileName);

        this.fuTemplateName.SaveAs(path + FileName);
        _t.FileName = FileName;

        if (!System.IO.File.Exists(path + FileName))
        {
            ArrayList ItemList = new ArrayList();
            ItemList.Add("Uploading failed, please upload again!");
            btlError.DataSource = ItemList;
            btlError.DataBind();
            _t.FileName = "";
            return;
        }

【问题讨论】:

  • 我知道我可以让用户重新上传文件。但就我而言,最好的方法是像我们在 ado.net 中一样使用事务。
  • 我会重新考虑操作流程以防止头痛:首先将文件上传到临时位置,如果上传成功验证一些数据,如果数据验证执行删除并移动上传文件到正确的位置。

标签: c# asp.net .net transactions


【解决方案1】:

我认为您只能手动执行此操作。看看 Martin Fowler 的UnitOfWork,你可以实现他所描述的东西

也检查这个链接也许对你有帮助

【讨论】:

  • 我认为有办法解决这个问题,因为这个概念非常重要。并且数据库系统也是基于文件系统的。应该有open-src框架什么的。
  • 检查链接,我添加到我的答案中
  • THX,我也发现windows Vista/7, server2008原生支持文件事务。
【解决方案2】:

我从来没有尝试过文件系统,但是代码项目上有很好的文章。

请看http://www.codeproject.com/Articles/31270/A-Transactional-Repository-Implementation-in-NET

希望它能解决您的问题。

【讨论】:

    【解决方案3】:

    Windows Vista 和更新版本的支持Transactional NTFS,这可能会对您有所帮助。

    但实际上,您应该考虑重新设计您的逻辑 - 上传到临时文件,如果上传成功,则仅删除原始文件(并重命名临时文件)。

    【讨论】:

    • 这个主意不错,但是还有很多其他地方也需要这样做,所以必须使用事务,让代码清晰。
    • ...那么还有很多其他地方需要修复代码 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    相关资源
    最近更新 更多