首页 > 编程语言 >C# WinForm 解除资源文件的占用并删除

C# WinForm 解除资源文件的占用并删除

时间:2024-05-14 15:52:41浏览次数:10  
标签:IntPtr Console 删除 filePath C# 占用 uint 文件 WinForm

1.删除未解除占用的资源时

img
img

2.调用Windows API函数 解除文件占用

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseHandle(IntPtr hObject);

        [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess,
            uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition,
            uint dwFlagsAndAttributes, IntPtr hTemplateFile);

        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool DeleteFile(string lpFileName);

        const uint GENERIC_WRITE = 0x40000000;
        const uint OPEN_EXISTING = 3;
        const uint FILE_SHARE_READ = 0x00000001;
        const uint FILE_SHARE_WRITE = 0x00000002;



        /// <summary>
        /// 解除文件并删除文件
        /// </summary>
        /// <param name="filePath">文件路径</param>
        private static void RelieveDeleteFile(string filePath)
        { 

            IntPtr fileHandle = CreateFile(filePath, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
            if (fileHandle != IntPtr.Zero && fileHandle != new IntPtr(-1))
            {
                bool success = CloseHandle(fileHandle);
                if (success)
                {
                    success = DeleteFile(filePath);
                    if (success)
                    {
                        Console.WriteLine("文件已被释放并删除。");
                    }
                    else
                    {
                        Console.WriteLine("文件释放成功,但无法删除。");
                    }
                }
                else
                {
                    Console.WriteLine("无法释放文件。");
                }
            }
            else
            {
                Console.WriteLine("文件已经处于可删除状态。");
                DeleteFile(filePath);
            }
        }


调用

        // 调用示例
        string filePath = "C:\\test.txt";
        RelieveDeleteFile(filePath);

结果

img

标签:IntPtr,Console,删除,filePath,C#,占用,uint,文件,WinForm
From: https://www.cnblogs.com/wofeiliangren/p/18191463

相关文章

  • Playwright执行 JavaScript 脚本:探索浏览器自动化的新境界
    前言我们在进行web自动化时,经常遇到一些不好操作的元素,普通的元素定位和操作容易报错,如果我们使用的selenium的话,就可以使用selenium调用js脚本进行操作。在playwright中也有类似的方法,使用page.evaluate()执行JavaScript脚本。page.evaluate()和page.evaluate_handle()之间的......
  • vs vs code 图标
    vscode图标含义图标含义图标含义图标含义局部变量成员变量属性类方法接口/typedef库中预定义的枚举自定义的枚举自定义的代码片段命名空间宏定义结构体关键字事件......
  • TypeScript 对象数组的类型
    在TypeScript中,你可以使用接口(interface)来定义这种对象数组的类型。接口允许你描述对象的形状,从而确保你的数据结构符合预期。对于给定的数据 [{"name":"小明","age":"18"},{"name":"小东","age":"10"}],你可以这样声明一个接口:interfacePerson{......
  • mockjs: 前端模拟后端
    mockjs参考:https://blog.csdn.net/Mme061300/article/details/1303432701.入门:vue引入mockjsvue3引入mockjsnpminstallmockjs--save-dev在项目中创建一个mock数据文件,例如mockjs/data.js`://mock/data.jsimportMockfrom'mockjs'constUser=Mock.mock({......
  • TypeScript 的类型注解
    在TypeScript中,类型注解是一种用于指定变量、函数参数、函数返回值等处的类型信息的语法。通过类型注解,你可以告诉TypeScript编译器某个变量的类型是什么,以便在编译时进行类型检查,并提供更好的代码提示和错误检测。类型注解通常使用冒号 : 后跟着一个类型来指定。例如:let......
  • scrum5
    这个作业属于哪个课程<班级的链接>这个作业要求在哪里<作业要求的链接>这个作业的目标<你理解的作业目标具体内容>任务分析任务分析界面设计确定所需知识数据分析具体代码实现测试继续学习......
  • scrum7
    这个作业属于哪个课程<班级的链接>这个作业要求在哪里<作业要求的链接>这个作业的目标<你理解的作业目标具体内容>任务分析任务分析界面设计确定所需知识数据分析具体代码实现测试具体的代码实现......
  • scrum6
    这个作业属于哪个课程<班级的链接>这个作业要求在哪里<作业要求的链接>这个作业的目标<你理解的作业目标具体内容>任务分析任务分析界面设计确定所需知识数据分析具体代码实现测试进行数据分析......
  • TypeScript主要类型
    TypeScript支持多种类型,其中一些主要类型包括:基本类型:number:表示数字,可以是整数或浮点数。string:表示字符串。boolean:表示布尔值,即 true 或 false。null 和 undefined:分别表示null和undefined。symbol:表示唯一的、不可变的值。复合类型:array:表......
  • Windows下git配合Unity要设置autocrlf=false
    Unity的.asset文件的换行符一定是Unix(LF)格式的,哪怕在设置里选了用Windows(CRLF)也没用。这个选项貌似只对创建的C#Script有效。这些Unix换行文件提交上去没问题,但如果你想revert或者checkout,就会变成Windows换行,然后如果在Unity里面修改了,哪怕最后实际数值没有变化,也会给你......