自定义MPxFileTranslator,当导出文件失败时原文件消失的问题

在最近的工作中,发现用户自定义的 MPxFileTranslator 存在这样一个问题,让我们来看一下问题的具体描述:

1. 首先,我们按照正常的步骤去自定义一个 MPxFileTranslator,详细步骤可以参考 http://docs.autodesk.com/MAYAUL/2013/ENU/Maya-API-Documentation/index.html?url=files/W_File_Trans_Implementing_a_File_Translator.htm,topicNumber=d30e17733

2. 当你需要导出/保存自定义的文件类型时,你需要重载如下两个函数,haveWriteMethod() 函数用来检查当前的translator是否有一个 write() 方法,write() 方法来具体导出/保存你想要的内容到该自定义文件中。

        virtualMStatus        writer (constMFileObject& file, constMString& optionsString,MPxFileTranslator::FileAccessMode mode);
        virtualbool           haveWriteMethod ()const;

3. 到目前为止,似乎一切都正常化,没有任何问题,但是我们有一个合作伙伴,他们自定义了一个MPxFileTranslator用于读写他们自己的文件类型,并且需要在存储文件时做一些验证,如果数据不正确的话,他们希望直接返回不保存,而不是继续导出文件。这个时候问题就出现了。当用户的保存需要覆盖原始文件,并且write()方法中验证没通过时,MS::kFailure就直接被返回,这个时候,我们发现,原来的文件不见了(或者数据不正确,取决于在write()函数中何时返回),而看到一个临时的备份文件,比如 lepTranslator.lepa06688


为什么保存出错的时候Maya不把原始文件恢复到原来的状态呢?经过查看Maya源代码和调试,发现事情原来是这样的。当Maya发现用户需要导出/保存数据到当前一个已有文件时,Maya为了防止原始数据被破坏,不会在原始文件上直接操作,而是会先把原始文件重新命名(就如我们前面看到的lepTranslator.lepa06688文件)。注意,此时原始文件已经不存在了,然后在原始文件的位置新建一个文件,导出/保存数据到该新文件,如果一切正常的话,Maya最后会把原来改名后的原始文件lepTranslator.lepa06688删除掉,这样一切正常。但是如果导出/保存时出错的话,Maya不会把临时的备份文件lepTranslator.lepa06688名字重新恢复成原来名字,而是提醒用户导出/保存出错,于是产生了上面这个文件消失的现象。

如何解决这个问题呢?
目前,这个行为是Maya的Legacy行为,如果当文件导出/保存出错时,用户需要把原始文件恢复到最初的状态,那么可以尝试使用下面这个API,这个函数会得到最新的临时文件全路径,然后你可以把这个名字中Lep后面的临时数据去掉,当然,可能还需要一些其他的判断来。

static MString MFileIO::getLastTempFile((MStatus *ReturnStatus=NULL) 

 

 

posted @ 2013-02-21 11:23  如梦令  阅读(390)  评论(0编辑  收藏  举报