2013-10-15 3 views
1

파일의 이름을 바꾸는 데 문제가 있습니다. 기존 파일의 여러 줄을 삭제하려고 시도하고 새 파일로 바꿉니다.이름 바꾸기 파일이 작동하지 않는 이유는 무엇입니까?

string line; 
ifstream myfile(filename); 
ofstream outfile; 
outfile.open(filename.append(".new")); 

if(myfile.is_open()) { 
    //loop here that runs through code and calles 
    //outfile << line; repeatedly 
} 

int test = rename(filename.append(".new").c_str(),filename.c_str()); 
if (test == 0) cout << "Success"; 
else cout << "Failure"; 

내가 온라인에서 본 것으로부터,이 새로운 문서를 작성하고, 채우고, 원본을 업데이트 된 것으로 바꾸기를 기대합니다.

내가 잘못 본 사람이 있습니까?

+1

새 파일의 이름을 바꾸기 전에 닫으시겠습니까? – usr2564301

+0

(가능하면 작업 할 때조차도) 하드 링크가있는 경우이 작업이 실패 할 수 있습니다. 기존 파일을 "삭제"하면 파일 이름의 링크 만 내용으로 삭제합니다. 동일한 콘텐츠에 연결된 다른 이름은 새 파일이 아닌 이전 파일에 계속 연결됩니다. –

+0

Windows에서 실행 중입니까? 그렇다면 이름 바꾸기를 수행하기 전에 이전 파일에 열려있는 핸들을 모두 닫아야합니다. 그렇지 않으면'ERROR_SHARING_VIOLATION'으로 실패합니다. 또는 호환되는 공유 모드로 파일을 열지 만 C++'iostream' API를 버려서 ['_fsopen()'] (http://msdn.microsoft.com/en-us/library/)와 같은 기능을 선호해야합니다. 8f30b0db.aspx) 또는 원시 시스템 호출 ['CreateFile()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx). –

답변

4

아직 두 파일을 열어 두었 기 때문에 실패한 것으로 보입니다. 파일이 잠겨있는 동안은 파일 이름을 바꿀 수 없습니다. 이름을 바꾸기 전에 파일을 닫으십시오.

또한 이름을 바꾸기 전에 원본 파일을 삭제해야합니다.

  • 열기 원본 파일 :

    는 의사 코드 이것은 당신이해야 할 것입니다.

  • 임시. 새 파일을 엽니 다.
  • 당신이하는 일을 모두 수행하십시오.
  • 두 파일을 모두 닫습니다.
  • 원본 파일을 삭제하십시오.
  • 이름 바꾸기.

rename에 대한 호출이 실패하면 C++ 구현이 errno으로 설정 될 수 있습니다. 따라서 errno 값을 확인하여 호출이 실패한 이유를 찾아야합니다. 문제를 스스로 진단 할 수 있도록 오류보고 메커니즘을 숙지하십시오.

+0

괜찮 았나, 포함했습니다. myfile.close(); outfile.close(); remove (filename.c_str()); rename (filename.append (". new") .c_str(), filename.c_str()); 이제 디렉터리를 검사 할 때 변경되지 않은 원본 인 ". 새"파일이 없습니다. – user2761933

+0

그래서 파일과 다른 것을 써라! 루프에서 복사하는 것 같습니다. 또한 이름 변경에 실패한 이유에 대한 질문이었습니다. 그리고 나는 분명히 그것에 대답했다고 생각합니다. –

+0

나는 파일과 다른 것을 쓰고있다. 나는 그것에서 몇 줄을 지우고 있는데, 아마도 이것은 이름 바꾸기 파일에 문제가있을 것이므로 변환의 세부 사항으로 내 게시물을 어지럽히고 싶지 않습니다.그리고 두 파일을 닫고 원래 파일을 제거 했음에도 불구하고 이름 바꾸기가 여전히 실패합니다. – user2761933

관련 문제