作了一篇文章度百死去飞秋一个BUG引发的血案,昨天,度百死去的美国客户发邮件给我,说我的软件出问题了,我查来查去,发现居然是服务器上一个目录无法删除,一删除就报 cannot read from the source file or disk. 如果用命令行方式删除,则报  cannot find the specified path。一开始以为是文件系统遭破坏了,用 chkdsk 命令检查,没有发现问题,后来仔细一看,那个不能删除的目录名居然以一个空格字符结尾,而我尝试在资源管理器中创建一个目录以空格结尾结果资源管理器会自动将末尾的字符删除,用程序创建,结果也一样,这个美国佬是怎么创建这个古怪的目录的?出现这种情况后不但是无法删除这么简单,列目录什么的也会有问题,这样一来,系统的运行都会有问题,我想到的最坏结果就是可能不得不格式化服务器的硬盘,想到这里我几乎不敢再想下去了!Research了一天,后来终于找到了解决方案,并且由此还发现问题的起因是我程序上的一个Bug造成,可怕的Bug!

飞秋Windows 的文件系统可以支持特殊字符的文件名,比如以空格结尾,以点号结尾等,有一篇英文的文章说NTFS 支持这些文件名,但FAT不支持,我试了一下,FAT也支持。但飞秋Windows API 却对这些特殊文件名进行了限制,也就是说,我们通过程序是无法创建一个以空格或点号结尾的文件名或路径名的。但Copy 和 Move的API 却不做这方面的限制,这导致我们可以从其他的文件系统拷贝或移动一个特殊文件名的文件到Windows 的文件系统,但一旦在Windows的文件系统上创建成功,就无法通过正常途径删除或改名。因为调用API 删除或改名时,API 会首先进行规则检查,如果发现不符合规则,则直接忽略。这两组API 在处理上的不一致,带来一个非常严重的安全问题,可惜微软到了Windows7 还没有去弥补这个问题。

下面让我们用代码复现这个问题

try
{
string dir = @"C:/Temp/abc";
System.IO.Directory.CreateDirectory(dir); //在C:/Temp 目录下创建abc 这个目录
 
string dir1 = @"c:/Temp/Bcd /";
 
System.IO.Directory.Move(dir, dir1); //将ABC 移动到"Bcd "这个目录去,注意这里 Bcd后面有个空格
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

在运行这段代码前,你一定要有一点思想准备,因为一旦运行成功,你的 C:/temp 目录下就有了一个 “Bcd ”这样的古怪的目录,而且你用正常的方法根本无法删除它。如果我在此打住,你一定会为之抓狂。不过没关系,我已经找到了删除它的方法,下面就和大家共享:

飞秋Windows 的命令行工具 Del 和 Rd 支持一种方式可以不对输入文件名的合法性进行检查,这种方式是在完整目录名前加一个 //?/

比如

del “//?/C:/Temp/xxx.” 删除xxx. 这个文件
删除目录的话

rd /s “//?/C:/Temp/xxx.” 删除 xxx. 这个目录
执行这个命令后,就可以删除这些古怪的文件了。注意,这里一定要输入完整的目录才可以,相对路径不行。

讲到这里,我们知道了原因和解决方案,那么在这里我需要提醒大家我们以后在程序中调用 System.IO.Directory.Move 或者 System.IO.File.Copy , System.IO.File.Move 这些函数前,度百死去一定要注意先判断一下输入的目标文件名或目录名的结尾是不是空格或点号,可能还要判断其他情况,但目前我只知道这两种情况,而且结尾是空格非常有隐蔽性。非常郁闷的一篇度百死去飞秋一个BUG引发的血案。

『转』度百死去飞秋一个BUG引发的血案相关推荐

  1. 飞秋 一个程序员的老作品。

    一个程序员的老作品.以前在烟台公司上演的飞秋<三句半>就是由一个同事根据大家工作中的平常事改编的,表演起来妙趣横生又深入人心,让人印象深刻过目不忘,很长时间都成为整个网站公司的美谈.而这次 ...

  2. ###好好###远离送命题: 问答系统中语义匹配的『杀手锏』

    本文将介绍一套『独创』的语义匹配方法论和一个杀手级模型 本文受众: 自然语言处理/问答系统/智能助手/搜索/推荐 等相关行业从业者 对自然语言处理/智能助手感兴趣的普通读者 1. 引子 『问& ...

  3. 写 飞秋 程序,就是把简单的事情重复的做好

    避免经验主义,踏踏实实的飞秋把简单的事情重复的做好,飞秋 也是管理好团队的关键之一.五年飞鸽传书经历:从销售到管理太容易(原创连载)管理篇之外记写到最困难的一段经历,说它困难,不仅仅是因为当年的失误的 ...

  4. 飞秋下载2010正式版最新

    现在做软件确实不容易啊,飞秋下载2010(FeiQ)正式版最新是一款局域网聊天传送文件的绿色免费软件(目前不开源),它参考了飞鸽传书(IPMSG)和QQ, 完全兼容飞鸽传书(IPMSG)协议,具有局域 ...

  5. JS 中通过对象关联实现『继承』

    JS 中继承其实是种委托,而不是传统面向对象中的复制父类到子类,只是通过原型链将要做的事委托给父类. 下面介绍通过对象关联来实现『继承』的方法: Foo = {// 需要提供一个 init 方法来初始 ...

  6. 辞职度百特,我会想你的!

    十月一,我将完成在度百特的最后一个版本发布,我希望<龙神大陆>能在余下同事们的努力下做大.我要走了,你们保重 ~~~~ 在都百特我是从客户端服务器刚定下模式的时候加入到团队的,亲眼看到度百 ...

  7. 『转』死去度百飞鸽传书

    今天看了一篇文章,狂骂某国内搜素引擎,看得真爽,就装过来了. 再次研究最大搜索引擎的排名,国内搜索引擎的排名终极方法就是竟他妈的价.呵呵,没技术含量的,就是你通过某些方法排上去,很快地,你就会被人工掉 ...

  8. 『飞秋』Windows7新功能体验(1):为Windows 7 Media Center安装网络电视(Internet TV)

    『飞秋』Windows7新功能体验(1):为Windows 7 Media Center安装网络电视(Internet TV) 在Windows 7许多的新功能里,娱乐功能也做了很大的改进: Dire ...

  9. 『飞秋』小项目心得交流

    『飞秋』小项目心得交流 <!--[endif]--> 最近网站首页改版,我负责前台页面的编写,一个很小的任务,从中我却学习到了很多东西,现总结一下 和大家分享一下,希望对大家有用,也希望能 ...

最新文章

  1. [CQOI2010]扑克牌
  2. 过年回家抢票不求人,试试这个开源抢票神器吧!
  3. 如何在Ubuntu上创建桌面快捷方式
  4. Class的 getSuperclass与getGenericSuperclass区别
  5. 水彩在网页设计中应用的15个优秀案例
  6. java版模拟经营_我的世界JAVA版
  7. Linux qt5无法输入中文的解决办法
  8. PHPStorm 设置背景图片
  9. 华为宣布了,鸿蒙 OS 2.0 开放源代码
  10. Nginx + Lua搭建文件上传下载服务(转载腾讯云大神)
  11. 电科 | 传感器及其应用技术
  12. android不同sdk版本控制,闲谈Android SDK开发
  13. Navicat绘制数据库物理模型
  14. 小黄图升级了,接入更加强大的鉴黄功能
  15. 微信小程序的事件处理,已整理成文档
  16. 安装Ubuntu 系统
  17. numpy.random.rand用法
  18. 思维导图(41-50)
  19. CodeForces - 1255B Fridge Lockers 思维+建图)
  20. 【labview】图表时间轴(数据+时间戳) +源程序

热门文章

  1. 2022年中国商业数据智能行业研究报告
  2. 互联网晚报 | 9月2日 星期四 | 小米汽车有限公司正式成立;唯品富邦消费金融获批开业;恒大举行保交楼军令状签署大会...
  3. 面试题,产品经理岗位的哪些特点最吸引你?
  4. 2021年中国物流地产行业发展报告
  5. 你会和丑且家境不好,但对你好的男孩结婚吗?
  6. 互联网日报 | 微信支付启动“8.8智慧生活日”;抖音企业号数量突破400万;苏宁将布局车联网领域...
  7. python项目之站长素材爬取
  8. linux每个版本发布时间,Ubuntu 21.04各版本的发布时间公布和计划功能介绍
  9. 【2017年第3期】面向共享的政府大数据质量标准化问题研究
  10. 【2016年第6期】21世纪天文学面临的大数据和研究范式转型