파일이 논리적으로 이동했는지 또는 물리적으로 이동하는지 판단하는 방법

StackOverflow https://stackoverflow.com/questions/736859

  •  09-09-2019
  •  | 
  •  

문제

사실 :

파일이 이동하면 두 가지 가능성이 있습니다.

  1. 소스 및 대상 파일은 동일한 파티션에 있고 파일 시스템 색인 만 업데이트됩니다.
  2. 소스와 대상은 두 개의 다른 파일 시스템에 있으며 파일은 바이트 당 바이트를 이동해야합니다. (일명 이동 중 사본)

질문:

파일이 논리적으로 또는 물리적으로 이동하는지 어떻게 결정할 수 있습니까?

큰 파일 (700 메그)을 전송하고 있으며 각 상황마다 다른 행동을 채택합니다.


편집하다:

이미 한 번에 파일을 MEG 씩 복사하기 위해 차단 IO 호출을 수행하는 작업자 스레드로 이동 파일 대화 상자를 코딩했습니다. 남은 시간 및 전송 속도의 대략적인 추정치와 같은 사용자에게 정보를 제공합니다.

문제는 : 파일을 물리적으로 움직이기 전에 파일을 논리적으로 움직일 수 있는지 어떻게 알 수 있습니까?

도움이 되었습니까?

해결책 2

알았어 난 뭔가에 있어요 :)

사용 JNA 나는 -하는 것이 가능하다 Win32 API에 전화하십시오 (및 *닉스 API도) Java에서.

나는 전화를 시도했다 GetFileInformationByHandle 그리고 결과를 얻었습니다 dwVolumeSerialNumber 속성은 항상 0과 같습니다 (내 C : D : Drive에서 시도)

그런 다음 MSDN 에서이 기능을 보았습니다. MoveFileEx. 플래그 매개 변수가 0으로 설정되면 이동 기능의 사본이 비활성화됩니다. 그리고 그것은 작동합니다 !!!!

그래서 나는 단순히 전화 할 것입니다

if (!Kernel32.INSTANCE.MoveFileEx(source.getAbsolutePath(), destination.getAbsolutePath(), 0)) {
    System.out.println("logical move failed");
}

다음은 다음에 넣을 코드입니다 Kernel32.java 인터페이스 (이 파일은 SRC.ZIP 패키지에서 찾을 수 있습니다. JNA 대지):

boolean MoveFileEx(String lpExistingFileName, String lpNewFileName, int dwFlags);

int MOVEFILE_REPLACE_EXISTING = 0x01;
int MOVEFILE_COPY_ALLOWED = 0x02;
int MOVEFILE_CREATE_HARDLINK = 0x04;
int MOVEFILE_WRITE_THROUGH = 0x08;
int MOVEFILE_DELAY_UNTIL_REBOOT = 0x10;
int MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20;

다른 팁

Linux 또는 다른 *Nices에서 전화하십시오 stat() 소스와 대상 디렉토리에서 비교하십시오 st_dev 가치. 그것들이 동일하다면, 논리적 이동을 수행 할 수 있습니다. 그렇지 않으면 실제 사본+삭제를 수행해야합니다.

Windows에서는 전화 할 수 있습니다 GetFileInformationByHandle() 두 디렉토리를 처리하고 비교합니다 dwVolumeSerialNumber 가치. 이를 위해서는 Windows 2000 이상이 필요합니다.

나는 당신이 Java를 사용하고 있음을 알았습니다.이 OS 수준 정보에 액세스 할 수있는 포털이 있어야합니다 (아마도 JNI?).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top