2010-07-09 29 views
2

我正在编写一个应用程序,它通过sidecar文件编目并保存元数据。我正在尝试添加文件IO操作,以便用户可以通过我的应用程序来操作(复制,重命名,移动,删除等),然后操纵边车文件。如何确保多个文件IO操作成功?

但是,我担心在某些情况下,一个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

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

没有直接托管的API用于此目的(优秀article由andyp使用p/Invoke引用)。我已要求将其添加到Windows API代码包中;你可以upvote请求here

1

这个MSDN杂志article表明,Windows Vista中(及以上)支持文件系统交易和甚至还有一个可管理的API。 HTH。