事务文件系统的ATL支持

你好,

null

我叫魏东皇,我是VisualC++团队的SDET。今天,我想谈谈VisualStudio2010中对事务文件系统的ATL支持。

什么是事务性文件系统?

事务文件系统是WindowsVista中首次引入的一种新技术。它使您能够回滚对文件系统和注册表所做的操作。  它有助于提高应用程序可靠性和数据一致性,而无需添加自己的工具。  通过在VC++中使用事务性文件系统,您可以将对文件和注册表的一组操作视为一个事务,该事务既可以作为一个整体完成,也可以反转。

可以使用事务性文件系统的一个示例:  开发人员创建几个新文件,将一些信息写入其中,删除一个现有文件,并希望完成所有操作或什么都不做。  他可以使用事务文件系统创建一个事务,将所有步骤添加到此事务中, 在一切正常时提交它,或者在某个步骤出现任何问题时回滚。

VisualStudio2010中实现了什么?

1. 添加了新的ATL类“CAtlTransactionalManager”:  CAtlTransactionManager是一个包装事务文件系统Windows api的新类,它提供了大多数在VC++中实现的事务文件系统功能,包括:

· 文件操作:CreateFile、DeleteFile、FindFirstFile、GetFileAttributes、SetFileAttributes、MoveFile。

· 注册表操作:RegCreateKeyEx、RegDeleteKey、RegOpenKeyEx

2. 为现有类和API添加了事务支持,包括:

· 类:CFile、CStdioFile、CAtlFile、CFileFind,方法是添加具有TransactionManager的构造函数,格式如下:

C文件(CATL事务管理器*);

CStdioFile(CAtlTransactionManager*);

CATL文件(CATL事务管理器*);

CFileFind(CAtlTransactionManager*);

· API:AfxRegCreateKey、AfxRegOpenKey、AfxRegDeleteKey,方法是在API中添加参数TransactionManager。

如何使用事务文件系统?

1. 使用CAtlTransactionManager:

(1) 创建一个CAtlTransactionManager;

(2) 调用CAtlTransationManager中的函数对文件或注册表执行操作

(3) 调用事务管理器Commit()提交更改,或调用RollBack()反转更改。

注: 有关代码示例,请参阅演练步骤2、3、4和5。

2. 使用CFile、CStdioFile、CAtlFile、CFileFind:

(1) 创建一个CAtlTransactionManager;

(2) 用第一步创建的事务管理器创建类;

(3) 调用类成员函数对文件进行操作;

(4) 调用事务管理器Commit()提交更改,或调用RollBack()反转更改。

注: 有关代码示例,请参阅演练步骤6。

3. 使用注册表API:

(1) 创建一个CAtlTransactionManager;

(2) 用第一步创建的事务管理器调用API函数对文件进行操作;

(3) 调用事务管理器Commit()提交更改,或调用RollBack()反转更改。

在WindowsVista之前的操作系统中会发生什么?

事务性文件系统仅在Windows Vista或更高级别的操作系统中受支持,不可用 在Vista之前的操作系统上,如WindowsXP和Windows2003。  如果应用程序在不支持它的操作系统中使用事务系统功能,它会崩溃吗?  答案是否定的。  创建CAtlTransactionManager时,有一个名为“Fallback”的选项,用于控制Vista之前的操作系统中的行为。 默认情况下,fallback为TRUE,这意味着如果不支持事务文件系统,您将获得与非事务版本相同的行为。  如果将回退设置为FALSE,则当不支持该操作时,该操作将失败。

使用事务文件系统的演练:

以下是帮助您了解事务文件系统用法的演练:

1. 创建一个默认的对话框类型MFC应用程序调用“TransactionalFileSystemDemo”。

2. 双击默认对话框(非文件对话框)中的“确定”按钮,并创建默认事件处理程序“ 无效 CtransactionAlFileSystemDemolg::OnBnClickedOk()”。以下步骤中的所有代码都将添加到此函数中。

添加代码

(1) 将以下代码添加到CtransactionAlFileSystemDemolg::OnBnClickedOk()

CAtlTransactionManager tmFileCommit1;

处理文件;

hFile=tmFileCommit1.CreateFile(_T(“c:TransactionFileSystemDemofile1.txt”),GENERIC|READ|GENERIC|WRITE,0,NULL,CREATE|ALWAYS,FILE|ATTRIBUTE|TEMPORARY,NULL);

关闭手柄(hFile);

hFile=tmFileCommit1.CreateFile(_T(“c:TransactionFileSystemDemofile2.txt”),GENERIC|READ|GENERIC|WRITE,0,NULL,CREATE|ALWAYS,FILE|ATTRIBUTE|TEMPORARY,NULL);

关闭手柄(hFile);

hFile=tmFileCommit1.CreateFile(_T(“c:TransactionFileSystemDemofile3.txt”),GENERIC|READ|GENERIC|WRITE,0,NULL,CREATE|ALWAYS,FILE|ATTRIBUTE|TEMPORARY,NULL);

关闭手柄(hFile);

WIN32查找数据nextFile;

tmFileCommit1.FindFirstFile(_T(“c:TransactionFileSystemDemofile1.txt”),&nextFile);

tmFileCommit1.SetFileAttributes(u T(“c:TransactionFileSystemDemofile1.txt”),文件属性u READONLY);

DWORD dwAttributes=tmFileCommit1.GetFileAttributes(_T(“c:TransactionFileSystemDemofile1.txt”));

tmFileCommit1.Commit();

结果

&注意服务提供商;      CAtlTransactionManager tmFileCommit2;

tmFileCommit2.DeleteFile(_T(“c:TransactionFileSystemDemofile2.txt”));

tmFileCommit2.MoveFile(u T(“c:TransactionFileSystemDemofile3.txt”),u T(“c:TransactionFileSystemDemofile4.txt”));

tmFileCommit2.Commit();

tmFileCommit2.Close();

1. 创建新文件夹“c:TransactionFileSystemDemo”;

2. 构建项目,将断点设置为“tmFileCommit1.Commit()”和“tmFileCommit2.Commit()”。

3. 调试应用程序,点击默认的“OK”按钮,在第一个断点处停止;

答。 观察nextFile和dwAttributes的值,它们应该有预期的值。

b。 打开资源管理器并检查文件夹“c:TransactionFileSystemDemo”:不应创建任何文件。

4. 继续调试并执行更多步骤,在“tmFileCommit1.Commit()之后停止

答。 选中文件夹“c:TransactionFileSystemDemo”:应在此文件夹中创建file1.txt、file2.txt和file3.txt。

5. 继续调试,在第二个断点处停止;

答。 检查文件夹“c:TransactionFileSystemDemo”:file1.txt、file2.txt和file3.txt仍然存在。

6. 继续调试并执行更多步骤,在“tmFileCommit1.Commit()之后停止

答。 检查文件夹“c:TransactionFileSystemDemo”:file1.txt应该被删除,file3.txt应该被重命名为file4.txt。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享