[java] File.exists ()는 파일이있을 때 false를 반환합니다.

나는 어떤 논리도 찾을 수없는 것처럼 보이는 버그를 만났습니다. 다음과 같이 생성 된이 File 객체가 있습니다.

File file = new File("utilities/data/someTextFile.txt");

그런 다음 file.exists()반환합니다.false (!?)가 됩니다. 파일을 찾을 수 없으면 파일에 기록 f.getAbsolutePath()하고 있습니다. 길을 보면 괜찮아 보인다. 전체 경로를 Windows의 “실행”창에 복사하여 붙여 넣으면 파일이 정상적으로 열립니다.

파일은 항상 존재하며 내 응용 프로그램을 실행하는 동안 삭제되거나 변경되지 않습니다. 로컬 시스템에 있습니다.

이것은 특정 상황에서만 발생하는 것 같습니다. 나는 언제든지 결함을 재현 할 수 있지만 결함을 재현하기 위해 수행하는 작업으로 인해 파일 객체의 경로가 변경되지 않는다고 확신합니다.

file.exists()거짓을 반환하는 원인 은 무엇입니까 ? 이것이 권한이나 파일 잠금 등과 관련이 있습니까?



답변

Windows 7에서 다음 상황이 나타납니다.

file.exists() == false
file.getAbsoluteFile().exists() == true

문제의 파일은 “var \ log”이며 절대 경로는 가상 저장소가 아닌 일반 하위 디렉토리에있는 기존 파일을 참조합니다. 이것은 IDE에서 볼 수 있습니다.


답변

Java에서 경로를 지정하는 방법에 차이가있는 것 같습니다.

예를 들어 파일 경로가 file:/C:/DEV/test.txt다음 과 같이 지정된 경우

File f = new File(filename);
f.exists();

반환 false됩니다. 경로는 탐색기 또는 브라우저에서 작동 할 수 있지만 절대 파일 경로가 아닌 URL입니다.

그러나 반면에 파일 경로가 C:/DEV/test.txt다음 과 같이 지정되면

File f = new File(filename);
f.exists();

true경로가 URL이 아니기 때문에 반환 되지만 절대 경로입니다.

정확히하는 일인 Spring Framework 를 사용하면 ResourceUtils.getFile(filename)이름이 URL 또는 절대 파일 경로가 될 수 있습니다.


답변

프로세스에 파일이 있는지 여부를 알 수있는 권한이 없으면 false를 반환합니다. 파일을 열 수는 있지만 파일이 있는지 일반적인 방법으로 알 수는 없습니다.


답변

위의 답변은 제 경우에는 도움이되지 않았습니다. 위에서 언급했듯이 나는 다음을 가졌다.

file.exists() => false
file.getAbsoluteFile().exists => true

이에 대한 근본 원인은 Windows 7 컴퓨터 소유자가 CMD에 대한 레지스트리를 수정하여 Python과 함께 작동하도록 특정 디렉터리에서 시작하는 명령을 자동으로 실행했기 때문입니다. 이 수정으로 인해 .NET 과 같은 특정 파일 작업을 위해 Windows 에서 CMD 를 사용 하는 Java 1.6 코드가 손상 되었습니다 . 레지스트리에서 자동 실행을 제거하면 문제가 해결되었습니다.exists()


답변

[ “알려진 파일 형식에 대한 확장명 숨기기.”]를 선택하면 [explorer] / [run windows]에서 “t.txt”를 입력하면 “t.txt.txt”가 열리지 만 프로그래밍 방식으로는 열리지 않습니다.


답변

분명히 여러 가지 가능한 원인이 있으며 이전 답변은이를 잘 문서화하지만 특정 경우에 대해 이것을 해결 한 방법은 다음과 같습니다.

제 학생이이 문제를 가지고 있었고 그것을 알아 내려고 거의 머리카락을 찢어 버렸습니다. 파일이 존재하는 것처럼 보이지만 존재하지 않는 것으로 밝혀졌습니다. 문제는 Windows 7이 “알려진 파일 형식의 파일 확장명 숨기기”로 구성되어 있다는 것입니다. 즉, 파일 이름이 “data.txt”인 것으로 나타나면 실제 파일 이름은 “data.txt.txt”입니다.

이것이 다른 사람들이 머리카락을 절약하는 데 도움이되기를 바랍니다.


답변

그만큼 new File 명령은 주어진 경로 이름을 사용하여 파일의 인스턴스를 만듭니다. 실제로 하드 드라이브에 파일을 생성하지는 않습니다.

당신이 말하는 경우

File file = new File ("path");
file.exists()

동일한 경로를 가진 기존 파일이있는 경우에만 true를 반환 할 수 있습니다. 첫 번째 줄에 선언 된 동일한 파일을 확인하려는 경우이 방법을 사용해야 할 수 있습니다.

File file = new File ("path");
file.createNewFile();
file.exists();

이제 이것은 true를 반환합니다.