首页 > 范文大全 > 正文

外部文件哪儿去了

开篇:润墨网以专业的文秘视角,为您筛选了一篇外部文件哪儿去了范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

我的“诊断手记”

编者按:如果您是信息技术教师,或善于钻研各种技术问题,那么在生活中,在教学中,一定亲历过无数的技术障碍,实施过不胜枚举的解决方案,有冥思苦想时的抽丝剥茧,更有挥剑斩棘时的畅快淋漓。总有那样一些“排雷”过程,让您记忆犹新,总有那样一些隐性的相关性让您不断刷新自己的认知。

现在,我们为您开设了这样一个陈列馆,期待您能够将这些珍贵的“诊断手记”陈列出来,在展示自己“技艺”的同时也为大家提供更多可供借鉴的思路和经验。

突遇新情况

我刚上完课,走进办公室,就见王老师早等在我的电脑旁了。见了我便迫不及待地说:“大春,帮看看,我这个视频怎么打不开啊!”

我一边拖过鼠标,一边说,视频文件没带上吧?“不会的,SWF课件能播放视频;但成EXE后播放视频就成了一片空白了!”王老师一边说着,一边示意我分别打开SWF和EXE两个版本的课件,果然是那样!

我打开Flash源文件,只见他在调用外部视频的帧上写着以下两行代码。

_root.createEmptyMovieClip ( "swf_mc", 1 );

_root.swf_mc.loadMovie ( "Flv/Tea.flv" );

我思忖着,没错啊,第一行创建一个影片剪辑swf_mc,第二行往swf_mc中装入外部影片“Flv/Tea.flv”。我再到文件夹里查看,跟FLA文件在一起,果然有一个Flv文件夹,里面也有一个能够正常播放的Tea.flv。

这下可真让人困惑了!到处都没有错,可结果却是错的——调不出视频。

寻找祸根源

问题出在哪儿呢?是不是因为使用了相对路径,导致EXE课件找不到Tea.flv文件。于是,我尝试着将EXE课件和Flv文件夹一起复制到我的电脑C盘根目录下,并将第二行语句改成:“_root.swf_mc.loadMovie ( "C:/Flv/Tea.flv" );”。 随后,我双击运行EXE课件,奇迹出现了,视频调用成功。

一波又三折

我大喜过望,以为使用绝对路径就可以成功调用。如何使用绝对路径呢?怎不能要求每次使用课件的时候,都把它固定地放在一个相同的位置?我想到了Flash AS中的“_url”属性——获取文件路径,然后截取路径中从开头到最后一个斜杠处的所有字符,再连上“/Flv/Tea.flv”,这样,一个动态的绝对路径便出来了。

于是我回到王老师的U盘中,打开源文件,将调用视频的两行代码改成如下三行:

fileName = _url.substr(0, _url.lastIndexOf("/"))+"/Flv/Tea.flv";

_root.createEmptyMovieClip ("swf_mc", 1 );

_root.swf_mc.loadMovie(fileName);

保存后成SWF课件和EXE课件,双击运行,竟被当头泼了一瓢冷水——问题依旧:SWF能播放外部视频,EXE却一片空白。

不识真面目

我又试着在场景中添加了一个动态文本框,命名为:fn_txt,然后在时间轴那三行代码之后再补上一句:fileName _txt.text = fileName;——看看这个视频文件的路径到底变成了什么面目!

再次保存后成SWF和EXE两种格式的课件,双击运行,结果真让人匪夷所思─SWF课件中的文本框显示的是正常的“file:///M|/我的课件/Flv/Tea.flv”;而EXE课件中的文本框显示的却是“file:///M|/鎴戠殑璇句欢/Flv/Tea.flv” —— 路径中的汉字都成了乱码。

原来,一切根源都在于Flash不识汉字真面目!

迎刃而不解

于是,我百度了一下“Flash exe 调用外部文件 问题”,可结果大多是类似这样的答案:“也遇到过这个问题,但最后知道EXE不支持loadmovie()。”哎,看来还是得自己寻求解决办法。于是详细查看Flash帮助,了解字符编码方面的知识,找到了一个escape(expression)函数——将参数转换为字符串,并以URL编码格式进行编码,在这种格式中,将所有非字母数字的字符都转义为%十六进制序列。这正是我所需要的,于是我赶快将Flash课件中的ActionScript改成这样:

fileName = _url.substr(0, _url.lastIndexOf("/"))+"/Flv/Tea.flv";

fileName = unescape(escape(fileName));

_root.createEmptyMovieClip("swf_mc",1 );

_root.swf_mc.loadMovie (fileName);

fileName _txt.text = fileName;

这样在loadMovie之前(第二行)用escape对调用的外部文件名进行URL编码,再用一个unescape把URL 编码的路径再解码回来。我很天真地以为这样就能解决Flash的汉字识别问题。但再次运行,终于让人彻底失望了——EXE课件对外部文件路径的解码还是一堆乱码。

后来,我通过进一步探究,发觉escape编码和unescape解码都是多余的,在ActionScritp的第一行语句中,就根本没有获取正确的外部文件路径——打包进去的播放器没有获取正确的中文文件名。

原来却如此

看来采用“file:///”形式的绝对路径行不通——因为用户不能确保整个路径中没有汉字,而播放器对汉字文件名又不识别。这时我想到了斜杠(“/”),在网站程序编写中,斜杠用来分隔目录,而第一个斜杠则代表网站的根目录,处于根目录下的主页文件对网站资源的调用有两种方式——绝对路径调用(从根目录“/”开始)和相对路径调用(从当前目录开始)。

能不能把Flash的EXE课件也想象成网站的首页呢?那么,它要调用同一文件夹里的Flv目录中的外部文件,除了前面尝试的“file:///”形式的绝对路径之外,还有两种方式:“Flv/Tea.flv”和“/Flv/Tea.flv”,前一种人们惯用的方式行不通,那么“/Flv/Tea.flv”方式呢?于是,我将上面的ActionScript改成这样:

fileName = "/Flv/Tea.flv";

_root.createEmptyMovieClip( "swf_mc",1 );

_root.swf_mc.loadMovie (fileName);

成SWF和EXE两种格式的课件,居然都运行通过,终于调出了久违的视频。

问题得彻解

问题解决了,我沾沾自喜一阵子之后,总觉得成EXE的Flash课件不能识别汉字文件名,是一个严重缺陷,是Flash播放器的一个令人遗憾的Bug,那么,高版本的播放器应该会有改进吧?于是,我改用10.0的播放器打开SWF课件,然后,单击“文件”、“创建播放器”,生成EXE课件,对三种路径调用方式分别进行测试,结果如下表所示。

从上表可见,如果你的课件用8.0的播放器打包成EXE文件,只有使用“/Flv/Tea.flv”这种形式调用外部素材;而“/Flv/Tea.flv”这种形式的外部文件调用在10.0的播放器中,又被全盘否定了——不管是SWF格式还是EXE格式,都应采用“Flv/Tea.flv”这种调用方式。

几天后,我把上面这个表格交给王老师,并说出的我观点和建议。王老师亲自实践后,拍着脑袋高兴地说,总算明白了,以后调用外部文件再也不会晕头转向了!