파일이 논리적으로 이동했는지 또는 물리적으로 이동하는지 판단하는 방법
-
09-09-2019 - |
문제
사실 :
파일이 이동하면 두 가지 가능성이 있습니다.
- 소스 및 대상 파일은 동일한 파티션에 있고 파일 시스템 색인 만 업데이트됩니다.
- 소스와 대상은 두 개의 다른 파일 시스템에 있으며 파일은 바이트 당 바이트를 이동해야합니다. (일명 이동 중 사본)
질문:
파일이 논리적으로 또는 물리적으로 이동하는지 어떻게 결정할 수 있습니까?
큰 파일 (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?).