2013-07-24 2 views
1

내 앱은 디렉토리에 대한 파일 변경 사항을 감시하고 변경 사항이있을 때마다 사본을 업로드해야합니다. 이렇게하려면 FileObserver을 사용했습니다. 나는 그것을 창조, 이동, 닫기 기록 및 수정에 업로드해야합니다. 문제는 수정에 달려있다. 수정은 디스크에 변경 사항이 기록 될 때마다 호출됩니다. 파일이 크고 (복사가 많이되거나 변경된 경우) 수백 개의 수정 이벤트가 발생하지 않을 정도로 원자 적이지 않은 경우 업로드를 시도 할 때마다 내 응용 프로그램이 꺼집니다. 여러 번 그것이 충돌합니다. 내 첫 번째 생각은 수정 이벤트를 제거하여 닫기 쓰기가 호출 될 때만 업로드하도록하는 것입니다. 불행히도, 이것이 항상 부름되지는 않습니다. 그래서 나는 다소 수정을해야 할 것이다. 그래서 내 질문은 이것입니다 : 파일 수정의 끝을 감지 할 때 가장 좋은 방법이 있습니까? 이 파일은 수정이 완료되면 업로드해야합니다. 이 일에 대해 어떻게 생각하세요? 마지막 수정 이벤트가 발생한 시점을 어떻게 알 수 있습니까? 복잡한 타이머 시스템을 만들어야합니까, 아니면 더 쉬운 방법이 있습니까? (없는 경우, 타이머 시스템을 만드는 가장 좋은 방법을 말해 줄 수 있습니까?)변경 사항을 기반으로 파일을 업로드하는 스마트 방법

많은 질문을했지만, 브레인 스토밍과 아이디어에 감사드립니다.

감사합니다.

편집 : 그래서 나는 이상한 것을 발견했습니다. Android 4.2 이상에서는 Open이 실행되지 않으므로 close은 실행되지 않습니다. 그냥 FYI.

답변

1

매 x 초마다 변경된 파일을 테스트하고 변경된 작업자 스레드를 사용하여 업데이트 된 버전을 필요한 곳으로 보냅니다. File.isOpen에 대한 테스트를 작성하는 파일을 보내지 않거나 발생하는 변경 사항을 추적하기 위해 부울 값을 사용하십시오. 행운의 비트와

+0

'File.isOpen()'? 내가 찾으면 유용하게 들리네. 너 무슨 소리 야, 이거 일종의 도서관이야? –

+0

FileObserver를 사용하고 열기/닫기 이벤트를 추적합니다. 또한 FileLock http://developer.android.com/reference/java/nio/channels/FileLock.html을 사용하여 파일에 대한 상호 액세스를 보장 할 수 있습니다. 파일에 순차적으로 액세스하는 경우 부울 변수를 사용하십시오. –

+0

좋아, 내가 그랬다. 해시 맵과 timertask를 사용하여 여러 이벤트를 10 초 지연으로 병목 현상을 일으켰습니다. 감사! –

1

파일이 텍스트 기반 인 경우 원본 파일과 수정 된 파일을 서로 비교할 수 있으며 다른 줄 수가 충분히 큰 경우 파일 만 업로드 할 수 있습니다.

+0

텍스트 기반 파일이 작동 실제로 사람입니다 ... 그들은 더 또는 덜 지속적으로 접수하고 가정, 수정 이벤트 사이의 시간을 추적하는 등의 일을 할 수 벌금. 수정 및 쓰기 닫기를 한 번 실행하는 원자 적 연산보다 더 자주 발생합니다. –

+0

독창성에 대해 +1하지만, 이것에 대해 생각하지 않았습니다. 모든 파일이 엄격하게 텍스트 기반 인 경우 작동했을 것입니다. 그들은하지 않습니다. –

1

, 하나는

last-notification = now; 
notification-interval = 1 s; /* some default */ 
listen for (file closed); 
listen for (file modified); 
alarm at (now + notification-interval); 

on (file modified) = 
     cancel alarm; 
     notification-interval = max (notification-interval 
            | [now - last-notification]); 
     alarm at (now + 2 × notification-interval); 

on (file closed) = 
     cancel alarm; 
     do upload; 

on (alarm) = 
     if (file is open?) then alarm at (now + 2 × notification-interval); 
     else (signal file closed)