增加修改vc2008工程临时输出目录脚本
diff --git a/tcutils/vcprojred.py b/tcutils/vcprojred.py
new file mode 100644
index 0000000..1eba84d
--- /dev/null
+++ b/tcutils/vcprojred.py
@@ -0,0 +1,132 @@
+# -*- coding: utf-8 

+'''

+Created on 2012-2-25

+更新 VC2008 工程编译输出的临时文件路径

+@author: cheng.tang

+'''

+

+

+import os,sys,re

+from optparse import OptionParser

+import xml.dom.minidom

+

+class vcprojred:

+    XML_HEADER_RE = re.compile(r'<\?\s*xml\s*version=\"([0-9.]*)\"\s*encoding=\"(\w*)\"\s*\?>')

+    def __init__(self):

+        self.root_dir_ = None

+        self.proj_count_ = 0

+        

+    def run(self,argv):

+        self._parse_opt(argv)

+        self._run_dir(self.options.solutiondir)

+    

+    def error(self,msg,exitcode = 1):

+        print "Error: %s" % msg

+        if exitcode > 0:

+            sys.exit(exitcode)

+                

+    def _run_dir(self,soludir):

+        if not os.path.isdir(soludir):

+            self.error(u"解决方案路径不存在")

+        self._check_dir(soludir)

+        print u"处理工程[%d]个" % self.proj_count_

+                

+    def _check_dir(self,projdir):

+        if os.path.basename(projdir) in ["..","."]:

+            return

+        files = os.listdir(projdir)

+        for item in files:

+            full_name = os.path.join(projdir,item)

+            if os.path.isdir(full_name):

+                self._check_dir(full_name)

+            elif os.path.isfile(full_name):

+                self._deal_proj(full_name)

+            else:

+                self.error(u"文件[%s]异常")

+                

+    def _load_xml_file(self,filename):

+        xml = open(filename,'r')

+        lines = xml.readlines()

+        xml.close()

+        if len(lines) == 0:

+            return None

+        m = vcprojred.XML_HEADER_RE.search(lines[0])

+        encoding = 'gb2312'

+        if m:

+            encoding = m.group(2)

+        try:

+            l = re.compile(encoding).sub('utf-8',lines[0])

+            lines[0] = l

+            content = ''.join(lines).decode(encoding).encode('utf-8')

+        except Exception,ex:

+            self.error(u"格式错误,%s" % ex, 0)

+            content = None

+        

+        return (content,encoding)

+    

+    def _save_xml_file(self,filename,content,encoding):

+        new_file = filename + '.bak'

+        if os.path.exists(new_file):

+            os.unlink(new_file)

+        os.rename(filename, new_file)

+        new_content = content

+        with open(filename,'ab') as f:

+            f.write(new_content)

+            f.close()

+    

+    def _deal_proj(self,projfile):

+        file_name = os.path.basename(projfile)

+        exts = os.path.splitext(file_name)

+        if exts[-1] not in ['.vcproj']:

+            return None

+        # parse project 

+        print u"处理工程 [%s]" %  projfile

+

+        prjdom = xml_encoding = None

+        try:

+            content,xml_encoding = self._load_xml_file(projfile)

+            prjdom = xml.dom.minidom.parseString(content)

+        except Exception,ex:

+            self.error(u'分析错误,[%s]%s' % (projfile,ex))

+            

+        if not prjdom:

+            self.error(u'文件[%s]解析错误' % projfile,0)

+            return False

+        

+        prj_nodes = prjdom.getElementsByTagName("VisualStudioProject")

+        if not prj_nodes:

+            return

+        configurations_nodes = prj_nodes[0].getElementsByTagName("Configurations")

+        if not configurations_nodes:

+            return

+        configuration_nodes = configurations_nodes[0].getElementsByTagName("Configuration")

+        

+        if not configuration_nodes:

+            return

+        

+        for config in configuration_nodes:

+            #print "Config[%s]" % config.getAttribute("Name")

+            config_name = config.getAttribute("Name")

+            intermediate_dir = config.getAttribute("IntermediateDirectory")

+            #print "Config[%s]dir[%s]" % (config_name,intermediate_dir)

+            new_path = "$(SolutionDir)%s\\$(ProjectName)\\$(ConfigurationName)" % self.options.outputdir

+            config.setAttribute("IntermediateDirectory",new_path)

+        

+        self._save_xml_file(projfile, prjdom.toxml(xml_encoding), xml_encoding)

+        self.proj_count_ += 1

+            

+    

+    def _parse_opt(self,argv):

+        parser = OptionParser()

+        parser.add_option("-d","--destination",dest="solutiondir",type="string")

+        parser.add_option("-o","--output_name",dest="outputdir",type="string",default="build")

+        (options,args) = parser.parse_args()

+        self.options = options

+        self.args = args

+        if not self.options.solutiondir:

+            parser.error(u"未指定工程路径")

+    

+    

+if __name__ == "__main__":

+    red = vcprojred()

+    red.run(sys.argv)