华天动力 OA8000 附件扩展类型还原

Python 2016-06-08 03:27 暂无评论

最近看到一个 OA 系统,发现附件目录下全部命名都是 *.dat 文件,一时苦恼起来还原的问题,你根本不知道它是什么鬼文件,或许是 .xls .xlsx .doc .docx .ppt .pptx .txt .zip .rar .png .jpg .jpeg .bmp 什么鬼??

好了,看了一下数据库发现表 file_storage 是存储下载时会获取文件路径以及对应名称将其提供下载并且重命名。。看了一下几万个文件,尼玛还是写一下渣代码吧。

嗯,Python 对中文还是有点坑。特别是 Windows 环境下。无奈只是重命名了扩展名,对原文件命名不做处理。因为有的目录不对甚至说同一个文件名会导致重复。。

整个操作很简单,就是轮询得到文件名丢到数据库查询是否存在该条纪录,存在则开始重命名。。如果多进程的话,速度会快很多~

代码在这儿~ 稍微改动了一点地方,嗯方便用

#!/usr/bin/env python
#coding: utf-8

__author__ = 'abj3ct10n'

import os
import os.path
import codecs
import MySQLdb

class RemoveName():
    def __init__(self):
        self.rootdir = "/wwwroot/" # 附件目录 或 OA 根目录
        self.filename = ""
        self.filedir = ""
        # 检查是否已知文件类型扩展名
        self.ext = ['.txt', '.rar', '.jpg', '.jpeg',
                    '.zip', '.doc', '.docx', '.xls',
                    '.xlsx', '.ppt', '.pptx', '.bmp',
                    '.png', '.xml', '.js', '.html',
                    '.htm', '.css', '.ini', '.gif',
                    '.jsp', '.pdf', '.php', '.aspx',
                    '.asp', '.ashx', '.jspx', '.class',
                    '.ppt', '.pptx']
        self.Traverse()

    def Traverse(self):
        for parent, dirnames, filenames in os.walk(self.rootdir):
            for self.filename in filenames:
                self.filedir = os.path.join(parent, self.filename)
                for i in self.ext:
                    if i in self.filename: # 判断是否包含扩展名
                        print("[Skip] %s" % self.filename)
                        break # 如果存在该扩展名类型, 跳出判断
                else: # 如果到最后一个判断都不存在, 那么开始重命名
                    self.match()

    def Remove(self, file_name, full_path):
        filedir = self.filedir.replace('\\', '/') # Windows 将斜杠转换为反斜杠
        ext = os.path.splitext(file_name)[1] # 得到真正的扩展名
        newfile = filedir.replace(os.path.splitext(filedir)[1], ext)
        os.renames(filedir, newfile) # 重命名, 将文件改回真实扩展名
        print("[Success] %s %s" % (self.filename, os.path.basename(file_name)[1]))

    def match(self):
        try:
            db = MySQLdb.connect("localhost, "username", "password", "databases", charset='utf8').cursor()
            try:
                db.execute("SELECT `file_name`, `full_path` FROM `file_storage` WHERE `full_path` LIKE '%%%s'" % self.filename)
                result = db.fetchone()
                if 'tuple' in str(type(result)):
                    self.Remove(result[0], result[1])
                    db.close()
                else:
                    print("[Error] %s %s" % (self.filedir, "Database does not exist the file record"))
                    db.close()
            except MySQLdb.Error, e:
                print("[%s] %s" % (e[0], e[1]))
        except MySQLdb.Error, e:
            print("[%s] %s" % (e[0], e[1]))

if '__main__' == __name__:
    RemoveName()
暂无评论