这就是一个记录debug过程的沙雕小故事。
早上收到了热心用户的反馈,程序有bug,还详细的附上了重现步骤,使用的输入文件,输出目录,log,对于开发者来说简直是小天使行为。
对于这么认真负责的用户,当然也要认真负责的对待。
这个程序的功能大概是用matplot生成一堆图片再贴到word文档里做成一个report,看一下log,File Not Found,异常信息写的清清楚楚明明白白,那一定是在生成report的时候找不到图片文件了。
仔细看一下文件的路径,再去对应目录下找一下,只有一个无后缀的0kb文件 – ‘nice’。
懂的人也许一下就懂了,也有的人,比如我,一下就得出了一个显而易见的结论:文件名里带着冒 ,这在windows中是不允许的。
虽然现在我们光看log就知道了问题所在,但Debug怎么能不尝试复现一下问题呢,就着用户提供的新鲜热乎的输入文件,我开始试图重蹈用户的覆辙。但。。。咦么走的这么顺利呢阳关道啊小水坑都没有的吗开生成的 告,那几个文件名带着冒 的图片都在啊,这是什么情况告诉我, 这一切并不简单!
果然,去到存临时图片的目录下,我们期待的nice:day.png并不在那,只有一个熟悉的0kb文件 – ‘nice’。不得了,这诡异的现象让我联想到了多年前肆虐的0kb病毒。
告正常生成了,说明至少图片的数据是在的。软件的bug我们尝试通过软件的方法来观察。
居然成功的读到了文件!
看着这串代码懵逼的我,脑海里产生了一个画面,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又是什么p>
https://www.maketecheasier.com/what-is-files-streams-and-how-to-make-good-use-of-them/
原来,是windows用来保存文件额外信息的地方,如此的隐蔽,如此的神秘,用来保存一些秘密岂不是美滋滋。。。。
不过,既然file stream可以通过代码读到,为什么我们的小天使用户那里 了错p>
再看看 错信息。。。。
One Drive直接把文件保存到了OneDrive的同步文件夹下了,是不是这个操作导致了问题的出现呢p>
经过我们的验证,的确如此。One Drive在同步文件的时候,导致文件的stream丢失了。
One Drive文件夹下是否文件都失去了stream使用 dir /R 命令来看一下。
并不是啊,这个zip文件的stream好好的呢。
那么,就是直接在同步文件夹下创建的文件会丢失stream啦。
这是个bug吗起来像是。 但,大概一般人也不会在乎吧~
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!