如何确保多个文件IO操作成功?

时间:2010-07-09 20:56:36

标签: c# .net file-io

我正在编写一个应用程序,通过sidecar文件对文件进行编目并保存元数据。我正在尝试添加文件IO操作,以便用户可以通过我的应用程序进行操作(复制,重命名,移动,删除等等),这也会操纵边车文件。

但是,我担心在某些情况下,一个IO操作将针对一个文件而不是另一个文件完成,从而使文件处于不一致状态。所以我想找出一种方法,可以确保所有IO操作都完成。

首先有一些方法可以确保IO操作成功吗?我当然可以测试File.Exists。但是还存在其他潜在的问题,例如文件的可访问性,它是只读状态,或者被另一个用户锁定,甚至进一步复杂化了。即使我最终测试所有可能的问题,仍然存在这样的可能性,但是可能的话,在尝试测试和实际IO操作之间的时间内文件将发生变化。假设文件在File.Exists(somefile.txt)File.Copy(somefile.txt,somefile2.txt)之间被删除。

或者我也在考虑创建一组表示文件IO操作的类,但是在执行操作后可以选择撤消。这样我的程序可以尝试多个IO操作,但是如果一个操作最终失败,以后能够轻松恢复所有更改。请参阅下面的界面。

这似乎是更好的选择,但我想听听其他意见。

public enum IOActionStatus {Not Run, Successful, Failed}

public interface
{
    public bool Go();
    public void Undo();
    public IOActionStatus Status;
}


public class CopyFileAction:IOAction
{
    public Copy File Action(string sourcepath, string destPath)
    {
    }

    public bool Go()
    {
        //attempts to to copy file
    }

    public void Undo()
    {
        //deletes the copied file if Go() was successful
    }

    public IOActionStatus Status{get; private set;}
}

2 个答案:

答案 0 :(得分:2)

Windows Vista及更高版本上存在文件系统事务(仅限NTFS;不支持FAT)。

没有直接托管API(andyp使用p / Invoke引用的优秀article)。我已请求将其添加到Windows API代码包中;您可以提交请求here

答案 1 :(得分:1)

此MSDN杂志article表明Windows Vista(及更高版本)支持文件系统事务,甚至还有可用的托管API。 HTH。