1 创建与使用
//创建GDB文件对象 CreateFileGDB process1 = new CreateFileGDB {out_folder_path = @"D:\新建文件夹", out_name = "temp.gdb"} GP.Execute(processor1, null);//将创建的GDB文件加入到GP工具中
注意上述代码中为out_folder_path设定的目录必须是已存在的目录,否则在使用GP工具执行时,会报错:对COM组件的调用返回了错误 HRESULT E_FAIL
使用
IWorkspaceFactory pWsFactory = new ShapefileWorkspaceFactoryClass(); IFeatureWorkspace pWorkSpace = pWsFactory.OpenFromFile(path, 0) as IFeatureWorkspace;
2 删除尝试
2.1 IDataset删除法
将IWorkspace转为IDataset,然后使用IDataset.Delete();进行删除。最好不要使用System.IO.File.Delete(path); 根据mdb或FileGDB的路径删除,这种方法可能删除不掉或者删不干净。
注意:删除该workspace之前需要将使用到的FeatureClass,Feature,FeatureCursor,Field等AO对象先释放掉,可以使用System.Runtime.InteropServices.Marshal.FinalReleaseComObject();释放。
IDataset dataset = pWorkspace as IDataset; dataset.Delete();
2.2 IFeatureWorkspaceManage接口移除要素类
删除GDB数据库中指定数据集的指定要素类,GDB数据库路径已知
public void DeleteFeatureClass(string featueClassName) { //打开GDB文件 IWorkspaceFactory worFact =new FileGDBWorkspaceFactory(); IWorkspace workspace = worFact.OpenFromFile("路径", 0); IFeatureWorkspace featureWorkspace = workspace as IFeatureWorkspace; //根据名称删除数据库要素 IFeatureWorkspaceManage featureWorkspaceMange = (IFeatureWorkspaceManage)featureWorkspace; IEnumDatasetName enumDatasetName = workspace.get_DatasetNames(esriDatasetType.esriDTFeatureClass); IDatasetName datasetName = null; while ((datasetName = enumDatasetName.Next()) != null) { if (datasetName.Name.Equals(featueClassName)) { featureWorkspaceMange.DeleteByName(datasetName);//删除指定要素类 break; } } }
2.3 解锁数据库
IWorkspaceFactoryLockControl ipWsFactoryLock = IWorkspaceFactoryLockControl)pWsFactory; //pWsFactory可以是GDB/SHP/MDB if(ipWsFactoryLock.SchemaLockingEnabled) { ipWsFactoryLock.DisableSchemaLocking(); }
2.4 清理COM对象
System.Runtime.InteropServices.Marshal.ReleaseComObject(Fact) System.Runtime.InteropServices.Marshal.ReleaseComObject(Workspace); System.Runtime.InteropServices.Marshal.ReleaseComObject(Fcls); System.Runtime.InteropServices.Marshal.ReleaseComObject(Fly); System.Runtime.InteropServices.Marshal.ReleaseComObject(pf); System.Runtime.InteropServices.Marshal.ReleaseComObject(pfield);
注意 Marshal.FinalReleaseConObject 与 Marshal.ReleaseConObject 的区别:
前者是直接将对象的引用计数减到0;后者只是引用计数减1
public static int FinalReleaseComObject (object o) { while (ReleaseComObject (o) != 0) ; return 0; }
2.5 杀进程删文件
下面的方法 无法删除timestamps文件,原因未知,欢迎大神指点;为什么所有文件都可以删除但是只有这个文件删不掉。
2.5.1 杀死线程
这个地方可能报错 【32位进程无法访问64位进程模块】
Process[] pcs = Process.GetProcesses(); foreach (Process p in pcs) { if (p.MainModule.FileName == "你的文件路径") { p.Kill(); } }
2.5.2 删除目录
此方法可能报错:【文件正由另一进程使用,该进程无法访问该文件】
///dir为要删除的文件夹 public void deleteDir(string dir) { try { Directory.Delete(dir, true); } catch { foreach (string file in Directory.GetFiles(dir)) { FileInfo info = new FileInfo(file); info.Attributes = FileAttributes.Normal; File.Delete(file); } Directory.Delete(dir); } }
2.6 终极删除
你手动强制执行一次垃圾回收,你应该调用GC.WaitForPendingFinalizers()。利用这个函数,你可以确保所有的等待被终结的对象在你的程序继续往下执行之前拥有机会执行一些所需的清理工作。GC.WaitForPendingFinalizers()会在清理期间挂起调用它的线程。这是一个好事,它确保你的代码不会在当前正要被销毁的对象上调用函数
在一个大神的代码中找到了这样的思路,仅仅一行代码完美的解决了这个问题。
//强制一次垃圾回收并等待每个对象被终结。 System.GC.WaitForPendingFianlizers();//挂起当前进程,直到处理终结器队列的线程清空该队列 Directory.Delete(gdbFileName, true);