문제

로그 파일을 파싱하고 특정 데이터를 서버로 보내는 애플리케이션을 개발해야합니다.Linux와 Windows 모두에서 실행되어야합니다.

이 문제는 로그 롤링 시스템을 테스트 할 때 나타납니다 (이름에 .1을 추가하면 동일한 이름의 새 시스템이 생성됨).Windows에서 (아직 Linux에서 테스트하지 않음) "입력 모드"(ios :: in)에서 열더라도 std :: ifstream () (독점 액세스?)로 연 파일의 이름을 바꿀 수 없습니다..

비 독점적 인 방법으로 파일을 여는 크로스 플랫폼 방법이 있습니까?

도움이 되었습니까?

해결책

<인용구>

비 독점적 인 방법으로 파일을 여는 방법이 있습니까?

예, Win32를 사용하여 다양한 FILE_SHARE_Xxxx 플래그를 CreateFile에 전달합니다. <인용구>

크로스 플랫폼입니까?

아니요, 플랫폼 별 코드가 필요합니다.

성가신 이전 버전과의 호환성 문제로 인해 (DOS 응용 프로그램은 단일 작업이므로 그 아래에서 파일을 삭제할 수 없다고 가정합니다. 즉, fclose () 다음 fopen ()을 아무 오류없이 수행 할 수 있습니다. Win16은이를 보존했습니다. DOS 응용 프로그램 포팅을 더 쉽게 만들기 위해 Win32는이 가정을 유지하여 Win16 응용 프로그램 포팅을 더 쉽게 만들었고 끔찍합니다. Windows는 기본적으로 파일을 독점적으로 여는 것입니다.

기본 OS 인프라는 열린 파일의 삭제 / 이름 바꾸기를 지원하지만 (메모리 매핑 된 파일을 삭제할 수 없다는 제한이 있다고 생각하지만 * nix에서 찾을 수있는 제한이 아니라고 생각합니다) 기본 열기 의미 체계 하지 마십시오.

C ++에는 이것에 대한 개념이 없습니다. C ++ 운영 환경은 DOS 운영 환경과 거의 동일합니다. 다른 응용 프로그램이 동시에 실행되지 않으므로 파일 공유를 제어 할 필요가 없습니다.

다른 팁

독점 모드가 필요한 것은 읽기 작업이 아니라 이름 바꾸기입니다. 이는 본질적으로 파일을 새 위치로 이동하는 것과 동일하기 때문입니다.

잘 모르겠지만 할 수있을 것 같지 않습니다.대신 파일을 복사하고 나중에 더 이상 읽을 수없는 이전 파일을 삭제 / 교체하십시오.

Win32 파일 시스템 의미론에서는 이름을 바꿀 때 이름을 바꾸는 파일이 어떤 모드에서든 열려 있지 않아야합니다.파일을 닫고 이름을 바꾼 다음 새 로그 파일을 만들어야합니다.

Unix 파일 시스템 시맨틱을 사용하면 파일 이름이 inode에 대한 포인터 일 뿐이므로 열려있는 파일의 이름을 바꿀 수 있습니다.

파일에서만 읽는다면 Windows api CreateFile을 사용하여 수행 할 수 있다는 것을 알고 있습니다.FILE_SHARE_DELETE |FILE_SHARE_READ |dwShareMode에 대한 입력으로 FILE_SHARE_WRITE.

불행히도 이것은 크로스 플랫폼이 아닙니다.하지만 Linux에서도 비슷한 것이있을 수 있습니다.

CreateFile에 대한 자세한 내용은 msdn을 참조하세요 .

편집 : Greg Hewgill의 의견에 대한 간단한 메모입니다.방금 FILE_SHARE * 항목으로 테스트했습니다 (100 % 확실하지 않음).읽기 전용을 열고 FILE_SHARE * 매개 변수를 지정하면 창에서 파일을 삭제하고 이름을 바꿀 수 있습니다.

파일을 열어 두지 않도록하겠습니다.예를 들어 앱이 충돌하면 이상한 일이 발생합니다. 내가하는 일 :

  1. 추상 (읽기 / 쓰기 / 새 파일로 롤오버)을 하나의 클래스로 만들고 해당 클래스의 새 파일로 롤오버하려는 경우 파일을 닫습니다.(이것은 가장 간단한 방법이며 이미 롤오버 코드가 있으므로 이미 절반 정도입니다.)
  2. 여러 개의 읽기 / 쓰기 액세스 포인트가 있어야하고 fstream의 모든 기능이 필요하며 완전한 래퍼를 작성하고 싶지 않은 경우 내가 생각할 수있는 유일한 크로스 플랫폼 솔루션은 파일을 닫지 않을 때 항상 파일을 닫는 것입니다.필요하지 않으며, 포기하기 전에 롤오버해야 할 때 롤오버 코드가 파일에 대한 독점 액세스 권한을 몇 번 얻도록합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top