我编写了一个程序,可以根据文件的扩展名对文件进行分类。截至目前,我正按照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 + "')";
答案 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 += "')";