【碎碎念】文件消失之谜

这就是一个记录debug过程的沙雕小故事。

早上收到了热心用户的反馈,程序有bug,还详细的附上了重现步骤,使用的输入文件,输出目录,log,对于开发者来说简直是小天使行为。

对于这么认真负责的用户,当然也要认真负责的对待。

这个程序的功能大概是用matplot生成一堆图片再贴到word文档里做成一个report,看一下log,File Not Found,异常信息写的清清楚楚明明白白,那一定是在生成report的时候找不到图片文件了。

FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\lokira\\OneDrive - lokira\\some path\\nice:day.png'

仔细看一下文件的路径,再去对应目录下找一下,只有一个无后缀的0kb文件 - 'nice'。

懂的人也许一下就懂了,也有的人,比如我,一下就得出了一个显而易见的结论:文件名里带着冒号,这在windows中是不允许的。

虽然现在我们光看log就知道了问题所在,但Debug怎么能不尝试复现一下问题呢?于是,就着用户提供的新鲜热乎的输入文件,我开始试图重蹈用户的覆辙。但。。。咦?我怎么走的这么顺利呢?一条阳关道啊?连个小水坑都没有的吗??打开生成的报告,那几个文件名带着冒号的图片都在啊,这是什么情况?直觉告诉我, 这一切并不简单!

果然,去到存临时图片的目录下,我们期待的nice:day.png并不在那,只有一个熟悉的0kb文件 - 'nice'。不得了,这诡异的现象让我联想到了多年前肆虐的0kb病毒。

报告正常生成了,说明至少图片的数据是在的。软件的bug我们尝试通过软件的方法来观察。

f = open("nice:day.png","r")
f.read()

居然成功的读到了文件!

看着这串代码懵逼的我,脑海里产生了一个画面,nice:就像一个传送门,把day.png传送到了一个异次元空间,只能通过nice: 这个门才能再次访问到。(一把年纪还中二的我)

为了验证想法,我尝试直接读取day.png,把nice删掉再读day.png,都失败了,证明nice和day.png是密不可分的。

但是nice的大小是0kb这件事深深困扰了我,day.png是nice的一部分,为什么会是0kb?难道我的一个无意操作造成了内存泄漏?虽然脑洞开的大,但是理性告诉我这是不可能滴,就凭我是不可能滴。

老老实实的调查,谷歌搜索filename colon windows。

Stack Overflow果然不会让我失望,在一番浏览以后,抓住了通向真相的线索。

Colon is reserved in the file-system namespace for file systems that support named streams, such as NTFS file streams. The colon is not part of the base filename. It delimits the base name from the stream name. You're creating a $DATA stream named "malware.exe" on the root directory. Even directories can have $DATA streams, but unlike regular files they can't have a default anonymous $DATA stream (e.g. opening "file.ext" is really opening its anonymous "file.ext::$DATA" file stream). 

https://stackoverflow.com/questions/48526904/how-can-this-code-generate-a-file-with-a-filename-containing-a-colon-on-windows

原来是file stream啊。

file stream又是什么?

https://www.maketecheasier.com/what-is-files-streams-and-how-to-make-good-use-of-them/

原来,是windows用来保存文件额外信息的地方,如此的隐蔽,如此的神秘,用来保存一些秘密岂不是美滋滋。。。。

不过,既然file stream可以通过代码读到,为什么我们的小天使用户那里报了错?

再看看报错信息。。。。

One Drive?用户直接把文件保存到了OneDrive的同步文件夹下了,是不是这个操作导致了问题的出现呢?

经过我们的验证,的确如此。One Drive在同步文件的时候,导致文件的stream丢失了。

One Drive文件夹下是否文件都失去了stream?我们使用 dir /R 命令来看一下。

04/05/2019  03:27 PM    <DIR>          .
04/05/2019  03:27 PM    <DIR>          ..
02/11/2019  04:24 PM    <DIR>          190237-toolbar
02/11/2019  04:23 PM         3,990,008 190237-toolbar.zip
                                   126 190237-toolbar.zip:Zone.Identifier:$DATA

并不是啊,这个zip文件的stream好好的呢。

那么,就是直接在同步文件夹下创建的文件会丢失stream啦。

这是个bug吗? 看起来像是。 但,大概一般人也不会在乎吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值