2012-06-29 5 views
0

디렉토리의 파일 이름을 바꾸고 싶습니다. 디렉토리에 52 개의 폴더가 있습니다. 각 폴더는 다른 이름을 가지고 있으며 각각에 약 40 개의 파일이 있습니다. 특정 폴더의 이름을 추출하여 특정 폴더의 파일 이름에이 이름을 첨부하려고합니다. 각 폴더에 파일이 31 개 이하일 때 정상적으로 작동했습니다. 그러나 특정 폴더의 파일 수가 31을 초과 할 때마다 내가 작성한 이름 바꾸기 알고리즘이 실패했습니다. 더 많은 파일이있을 때 충돌하는 이유를 알아낼 수 없습니다. 왜 이해한다면 저를 계몽 해주십시오 ...! 나는 코드를 부착 해요 :directory_iterator file_iter 폴더의 파일 이름을 바꿉니다.

int main(int argc, char** argv){ 
directory_iterator end_iter; 
directory_iterator file_itr; 

string inputName; 
string checkName; 
inputName.assign(argv[1]); 


if (is_directory(inputName)) 
{ 

    for (directory_iterator dir_itr(inputName); dir_itr != end_iter; ++dir_itr) 
    { 
     if (is_directory(*dir_itr)) 
     { 
      for (directory_iterator file_itr(*dir_itr); file_itr != end_iter; ++file_itr) 
      { 
       string folderName(dir_itr->path().filename().string()); 
       if (is_regular_file(*file_itr)) 
       { 
        std::string fileType = file_itr->path().extension().string(); 
        std::transform(fileType.begin(), fileType.end(), fileType.begin(), (int(*)(int))std::toupper); 
        if (fileType == ".JPG" || fileType == ".JPEG" || fileType == ".JPG" || fileType == ".PGM") 
        { 
         string filename(file_itr->path().string()); 
         string pathName(file_itr->path().parent_path().string()); 
         string oldName(file_itr->path().filename().string()); 

         cout << folderName << endl; 
         folderName += "_"; 
         folderName += oldName; 

         string newPathName = pathName + "\\" + folderName; 
         cout << pathName <<"\\"<< folderName << endl; 

         //RENAMING function 
         rename(file_itr->path(), path(newPathName.c_str())); 

        } 
       } 
      } 
     } 
    } 

} }

+0

어떤 시점에서 디버깅을 시도했는지, 왜 충돌했는지 확인해 보셨습니까? 또한, 캐스트'(int (*) (int)) std :: toupper'는 위험한 것처럼 보입니다. char는'int'가 아닙니다. – tehlexx

+0

실제로, 그 충돌하지. 31 명 미만의 사진이있을 때. 이름 바꾸기가 정상적으로 작동합니다. 예 : 첫 번째 폴더 이름이 '1'이면 파일 이름이 1_133422394789.jpg로 바뀝니다. 그러나 파일 수가 많을 경우 이름 바꾸기는 1_1_133422394789.jpg, 1_1_1_1_12874638746.jpg 등이됩니다. 이 prob는 'end_iter'인 – cameo

+0

과 관련이 있다고 생각하지만 31 세가 넘으면 충돌이 발생합니까? 다른 파일/폴더 이름을 사용해 보셨습니까? 어쩌면 그 중요한 번호가 아니라 파일 이름. 어쩌면 당신은 그것이 작동하는 폴더/파일에 대한 예제를 게시 할 수 있으며, 그렇지 않은 경우에는 예제를 게시 할 수 있습니다. – tehlexx

답변

2

그것은 부스트의 directory_iterator 구현 당신이 디렉토리 목록에있는 파일을 이름을 변경하여 혼동 점점 가능성이 높습니다.

경고 : 워드 프로세서

파일 또는 하위 디렉토리에서 제거하거나 디렉토리에 대해 directory_iterator의 건설 후 디렉토리에 추가되면, 그것은 이후의 여부 지정되지 반복자를 증가 시키면 값이 제거되거나 추가 된 디렉토리 항목 인 반복자가 생성됩니다.

두 단계로 시도하는 것이 좋습니다. 첫 번째 단계에서는 파일의 이름을 바꾸는 대신 지금 작성한 코드를 사용하여 vector<pair<string, string> >을 작성하십시오. 그런 다음 디렉토리를 스캔 한 후에는 목록을 통해 실제 이름을 반복하여 반복해야합니다.

+0

예 데이브 고맙습니다 ... 나는 directory_iterator가 엉망이되고있는 것 같아요. '문서'는 내가 end_iterator를 사용하면서 가졌던 혼란을 설명합니다 ...! – cameo

관련 문제