基于C#的ArcEngine二次开发40:如何删除临时GDB文件

简介: 基于C#的ArcEngine二次开发40:如何删除临时GDB文件

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);
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
1月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
35 1
|
1月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
84 0
|
3月前
|
NoSQL Linux Windows
geopandas直接支持gdb文件写出与追加
geopandas直接支持gdb文件写出与追加
|
3月前
|
NoSQL 数据挖掘 定位技术
如何让geopandas支持写出gdb文件
如何让geopandas支持写出gdb文件
|
3月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
116 19
|
3月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
244 2
|
3月前
|
文字识别 C# Python
使用C#将几个Excel文件合并去重分类
使用C#将几个Excel文件合并去重分类
30 3
|
3月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
3月前
|
C#
C# 写日志文件
C# 写日志文件
42 0
|
5月前
|
C#
【C#】C#读写Excel文件
【C#】C#读写Excel文件
126 1