vb.net 如何复制一个正在使用的文件
1、用资源管理器重现问题
SQL Server数据库文件会被SQL Server进程独占锁定,在资源管理器中复制正在使用中的SQL Server数据库文件会出现异常。


2、新建一个VB.NET工程
在VS.NET中新建一个的WinForm工程,只有一个Form,Form上有两个按钮:Button1和Button2。

3、用VB.NET中常规的文件复制方法重现问题
双击Button1添加如下代码,运行后会出现下图所示的异常。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
FileCopy("D:\Test\demo.mdf","D:\Test\demo1.mdf")
End Sub

4、如何复制正在使用中的文件呢?
如果要复制正在使用中的文件,需要使用到VSS(卷影拷贝服务)技术,可以自行百度:VSS 卷影拷贝服务,了解这项技术的原理。

5、在VB.NET中使用VSS技术
百度搜索下载AlphaVSS和AlphaFS两个开源项目的相关文件,在VB.NET工程中添加如下引用引用。关键字如下:
AlphaVSS site:alphavss.alphaleonis.com
AlphaFS site:alphafs.alphaleonis.com


6、添加VSS文件复制代码
双击Button2添加如下代码,运行后就可以正常复制了。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim sourceFile,destFile As String
sourceFile="D:\Test\demo.mdf"
destFile="D:\Test\demo1.mdf"
using vss as new VssBackup
vss.Setup(Path.GetPathRoot(sourceFile))
File.Copy(vss.GetSnapshotPath(sourceFile), destFile)
End Using
End Sub

7、下载测试工程代码
测试工程代码共享在如下位置,可以自行下来测试。
下载路径:http://pan.baidu.com/s/1o8Lv7U6
