2014-03-19 2 views
1

확장명에 따라 파일을 분류하는 프로그램을 작성했습니다. 이제는 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

시도 뭔가 : (그것은 약간의 오차가있을 수 있습니다 그래서 그것을 컴파일되지 않았다) 내가있어 나는이 auto를 사용 했어

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

훨씬 간단한 방법으로지도를 초기화 할 수 있습니다. http://stackoverflow.com/a/138612/4323 –

+0

감사합니다. @JohnZwinck, 멋진 아이디어 :) +1 – kolenda

+0

+1했습니다. 존 zwink 방법 !! – user3264565

1

u는 너무 많이 반복 한 코드, u는 확장을 소요하는 방법을 확인하고이에 있어야 폴더를 반환 할 수 있습니다, 다음 반환 된 폴더에이 파일을 저장 이 같은

+0

고맙습니다.하지만 내 주요 질문은 확장 프로그램을 그룹화 한 다음 사용하는 것이 가장 좋은 방법인지 여부입니다. – user3264565

0

아무 생각이 무엇을 당신의 일반 그렇습니다. 오류 확인도 없습니다 (즉, 확장이 일치하지 않는 경우).

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 += "')"; 
1

이는 경우 - 다음 조건을 방지하기 위해 관련, 그러나 당신은 당신의 코드를 재 작업려고하고 있다는 것을 주어지지 ...

당신은 "보안 환경"에서 작업하는 경우 모르고, 문자열로 쿼리를 구성하는 대신 parameterized queries을 사용합니다. 이들은 SQL Injection Attacks을 다루는 데 훨씬 좋습니다.

SQL 주입은 응용 프로그램 보안에서 주로 악용되는 문제 중 하나이며 2004 년부터 OWASP Top 10에서 한 곳을 찾았습니다. SELECT 쿼리 삽입에서 WHERE 또는 HAVING 절을 사용할 수있는 많은 블로그 게시물과 논문이 있지만 그 외에도 SQL injection in INSERT query.

관련 문제