检查多个文件类型的方法

时间:2014-03-19 10:45:13

标签: c++

我编写了一个程序,可以根据文件的扩展名对文件进行分类。截至目前,我正按照if-else条件对它们进行分组[代码如下]。我打算使用一个单独的类,然后在该类中保留所有文档类型。欢迎任何更简单的实现。

if(it->path().extension() == ".txt"||it->path().extension() == ".doc"||it->path().extension() == ".docx"||it->path().extension() == ".pdf") 
    {   
        f[0].filePath=it->path();
        f[0].fileName=it->path().filename();
        f[0].fileExt=it->path().extension();

        query="Insert into Filemanager(Filepath,Filename,Category)values('" + f[0].filePath.string() + "','" + f[0].fileName.string() + "','Documents')";       
    }
    else if(it->path().extension() == ".mp3"||it->path().extension() == ".wma") 
    {      
        f[1].filePath=it->path();
        f[1].fileName=it->path().filename();
        f[1].fileExt=it->path().extension();            
        query="Insert into Filemanager(Filepath,Filename,Category)values('" + f[0].filePath.string() + "','" + f[0].fileName.string() + "','Music')";       
    }
    else if(it->path().extension() == ".mp4") 
    {          
        f[2].filePath=it->path();
        f[2].fileName=it->path().filename();
        f[2].fileExt=it->path().extension();            
        query="Insert into Filemanager(Filepath,Filename,Category)values('" + f[0].filePath.string() + "','" + f[0].fileName.string() + "','Videos')";      
    }
    else if(it->path().extension() == ".jpg"||it->path().extension() == ".jpeg"||it->path().extension() == ".gif") 
    {          
        f[3].filePath=it->path();
        f[3].fileName=it->path().filename();
        f[3].fileExt=it->path().extension();            
        query="Insert into Filemanager(Filepath,Filename,Category)values('" + f[0].filePath.string() + "','" + f[0].fileName.string() + "','Pictures')";        
    }
    else 
    {     
        f[4].filePath=it->path();
        f[4].fileName=it->path().filename();
        f[4].fileExt=it->path().extension();            
        query="Insert into Filemanager(Filepath,Filename,Category)values('" + f[0].filePath.string() + "','" + f[0].fileName.string() + "','Others')";      
    }

我想避免if-else条件。提前谢谢。

最终返工代码:

std::map<string,string> docTypes = boost::assign::map_list_of (".txt", "Documents") (".pdf", "Documents") (".pdf", "Documents") (".rtf", "Documents")
                                                                                        (".jpg", "Pictures") (".jpeg", "Pictures") (".gif", "Pictures")
                                                                                        (".mp3", "Audio") (".mp4", "Audio")
                                                                                        (".wma", "Video") (".flv", "Video");        
f[0].filePath=it->path();
    f[0].fileName=it->path().filename();
    std::map<std::string,std::string>::iterator docIterator=docTypes.find(it->path().extension().string());
    if( docIterator != docTypes.end() ) 
    {
         category = docIterator->second;
    }
    else
    {
        category="Others";
    }
    query="Insert into Filemanager(Filepath,Filename,Category)values('" + f[0].filePath.string() + "','" + f[0].fileName.string() + "','" + category + "')";                

4 个答案:

答案 0 :(得分:4)

尝试这样的事情:(我没有编译它,所以它可能有一些错误)

std::map<std::string,int> extMap;

// put your extensions here...
extMap.insert( std::pair<std::string,int>(".txt", 0) );
extMap.insert( std::pair<std::string,int>(".doc", 0) );

extMap.insert( std::pair<std::string,int>(".mp3", 1) );
...

// find an extension and its index
std::map<std::string,int>::iterator it2 = extMap.find( it->path().extension() );

if( it2 != extMap.end() ) {
    int index = it2->second;

    f[index].filePath = ...
}

答案 1 :(得分:1)

你有太多重复的代码,你可以制作一个接受扩展的方法并返回它应该在的文件夹,然后将这个文件存储在返回的文件夹中

答案 2 :(得分:1)

这与避免if-then条件无关,但考虑到你要修改你的代码......

不知道你是否在“安全环境”工作,我会使用parameterized queries而不是在字符串中构建查询。这些处理SQL Injection Attacks要好得多。

SQL注入是应用程序安全性中最常被利用的问题之一,并且自2004年以来在OWASP Top 10中占据了一席之地。有很多博客文章,有关SELECT查询注入的文章可利用WHERE或HAVING子句,但也有{ {3}}

答案 3 :(得分:0)

我不得不使用auto,因为我不知道你的类型是什么。也没有错误检查(即,如果扩展名不匹配)。

auto path = it->path();
auto extension = path.extension();

int index = -1;
auto queryFolder = "";

    if (extension == ".txt" || extension == ".doc" || extension == ".docx" || extension == ".pdf") 
    {   
        index = 0;
        queryFolder = "Documents";
    }
    else if (extension == ".mp3" || extension == ".wma") 
    {      
        index = 1;
        queryFolder = "Music";
    }
    else if (extension == ".mp4") 
    {          
        index = 2;
        queryFolder = "Videos";
    }
    else if (extension == ".jpg" || extension == ".jpeg" || extension == ".gif") 
    {          
        index = 3;
        queryFolder = "Pictures";        
    }
    else 
    {     
        index = 4;
        queryFolder = "Others";
    }

    f[index].filePath = path;
    f[index].fileName = path.filename();
    f[index].fileExt = extension;     

    auto query = "Insert into Filemanager(Filepath,Filename,Category)values('" + f[index].filePath.string() + "','" + f[index].fileName.string() + "','";
    query += queryFolder;
    query += "')";