最近遇到这样的问题,Android下运行程序Program,在程序初始化时会创建自己的工作目录,存放一些缓存、日志和配置文件。

而如果用户在此程序运行期间删除了它的工作目录,此程序会在下次用到该目录时,发现目录已经不可访问,然后重新创建目录,但是创建会失败,导致后续的崩溃。

而创建失败的原因是errno 16 : EBUSY (Device or resource busy), 意思是说当前目录已经被占用,不可以创建同名的目录覆盖它。

我很郁闷,原来的目录不是已经访问不到了(access()或File.exists()),为什么会出现这种问题呢?

问题解析:用户在删除目录之前,program程序中还有指向该目录中文件的文件指针没有关闭,也就是说程序还在引用该目录里文件,因此此目录是删除不了的。用户执行了删除操作后,即使看到文件管理器中没有了该目录,而实际上该目录还是存在的,操作系统是能够识别的。因此,下次程序需要访问目录时,发现该目录访问不了,因此它认为此目录不存在(实际上存在,只是不可访问了),因此想要创建新的同名目录,而操作系统发现这是要覆盖已有目录的操作,而已有目录正在被引用,不可覆盖,因此会报错。所以,program认为发生了目录创建失败,就会导致后续的失败。

总之,一句话,问题的原因是你删除了文件,而之前没有关闭掉文件

解决方法:在文件或目录删除前,保证所有的文件指针被关闭掉,即关闭所有对文件的引用。但是我怎么知道文件什么时候会被(手痒的用户)删除呢?

一种方式,就是每次操作文件,都要打开文件和关闭文件的操作,这样可以避免长期引用文件,极大减少了以上问题发生的概率。但是对于一些文件操作频繁的功能来说,每次都要打开文件是低效的,比如日志操作,经常要写日志文件。对于这种情况,长期持有文件指针是高效的,但是会遇到之前的问题。我的做法就是,每次访问文件指针之前,都要判断当前路径还是否完好,如果路径不存在了,那就关闭当前目录下所有的文件指针,这样能保证不再持有相关的文件引用,使得当前目录能被正常删除,然后重新创建目录,然后重新创建文件,并打开文件再次保存文件指针。

转载于:https://www.cnblogs.com/guoxiaoqian/p/4468615.html

程序运行时被用户删除了工作目录后崩溃相关推荐

  1. Delphi-TScreen表示应用程序运行时屏幕的状态

    TScreen表示应用程序运行时屏幕的状态. 类关系 TObject->TPersistent->TComponent TScreen引进具有表示下列各种情况的属性 什么窗体和数据模块已经 ...

  2. 程序运行时的存储组织及管理

    目录 程序运行时的存储组织及管理概述 静态存储分配 临时变量的地址分配 简单栈式动态存储 嵌套过程语言的栈式实现 display 表方法 存取链(静态链)方法 参数传递 程序运行时的存储组织及管理概述 ...

  3. python画完图 程序暂停运行_暂停程序运行,以获取用户录入信息

    大家好,我们今日讲解"VBA信息获取与处理"教程中第十一个专题"VBA如何做到延时获得数据信息"的第五节"暂停程序运行,以获取用户录入信息" ...

  4. java 程序运行时注入方法_Spring入门(九):运行时值注入

    Spring提供了2种方式在运行时注入值: 属性占位符(Property placeholder) Spring表达式语言(SpEL) 1. 属性占位符 1.1 注入外部的值 1.1.1 使用Envi ...

  5. VS2008工具,两种加入库的方法。 设置程序运行时目录

    方法一:整个编译器加入库 tools->Projects and Solutions->VC++ Directories->右上角选择Library files 加入D:\work\ ...

  6. python怎么在运行中查看执行状态_python,_python程序运行时 查看对象状态,python - phpStudy...

    python程序运行时 查看对象状态 不知大家有没有用过Rthymbox的python console. Rthymbox可以在运行的时候,让它的 交互式命令行 对程序进行控制. 比如说可以调用pla ...

  7. Python语言的动态性:运行时动态绑定,删除属性和方法

           Python是动态语言,动态语言是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.通俗点说就是在运行时代码可以根据某些 ...

  8. linux直接运行程序加载动态库失败,扣丁学堂Linux培训详解程序运行时加载动态库失败解决方法...

    今天扣丁学堂Linux培训老师给大家介绍一下关于Linux程序运行时加载动态库失败的解决方法,希望对同学们学习有所帮助,下面我们一起来看一下吧. Linux下不能加载动态库问题 当出现下边异常情况 . ...

  9. 微信小程序性能测试——小程序运行时性能测试

    微信小程序性能测试主要可以分为两个方面,启动性能 和 运行时的性能.启动性能测试可参考前面文章<微信小程序性能测试--启动性能专项测试>,本文主要介绍如何利用 云测服务 进行小程序运行时性 ...

  10. 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

    参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...

最新文章

  1. 使用PHP Excel类读取和生成excel文件
  2. HTML和jQuery拆分成两个文件
  3. LeetCode 1340. 跳跃游戏 V(DP)
  4. ECCV18 Oral | MVSNet: 非结构化多视点三维重建网络(高精度高效率,代码已开源)...
  5. 可燃气体浓度多少合格_科普:气体容积单位LEL%、VOL%、TLV(ppm)之间如何换算?...
  6. C++ 什么是伪函数,以及伪函数的使用
  7. Notepad++相关插件
  8. SQL Server 锁
  9. python struct pack string_struct (String) – Python 中文开发手册
  10. 安卓实现调用三方地图导航
  11. node-sass安装失败完美解决方法
  12. 20145306 信息安全系统设计基础 第五周博客总结
  13. 农大计算机工程,肖德琴-华南农业大学计算机科学与工程系
  14. COGS 2815. 天黑请闭眼
  15. 架构师教你:如何实现两个完全独立闭环业务系统的融合。
  16. sgx是什么要开吗_绝了!滑滑梯设计在顶楼,上去一滑不就是直接跳…楼…吗??...
  17. 文件中查找并删除feff
  18. PCGBooK第一章 阅读笔记
  19. 使用暴风激活后首页被劫持
  20. 用CPU 0.2s轻松识别十万类,超强图像识别系统PP-ShiTu重磅发布

热门文章

  1. FTP 简介与 Windows 系统搭建 FTP 服务器
  2. java.net.URLEncoder 、URLDecoder 编码与解码
  3. nacos修改端口号
  4. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_1-4系统的整体演示...
  5. 移动端页面开发资源总结
  6. 阶段3 3.SpringMVC·_03.SpringMVC常用注解_8 SessionAttributes注解
  7. 阶段3 2.Spring_05.基于XML的IOC的案例1_4 注解IOC案例-把自己编写的类使用注解配置...
  8. Hibernate视频学习笔记(8)Lazy策略
  9. java之struts2之类型转换
  10. Spark系列(三)SparkContext分析