你好,
我叫魏东皇,我是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。