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


90

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

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

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

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

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

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


그렇다면 exist ()가 false를 반환하더라도 파일에서 읽을 수 있습니까?
Harry Lime

예, exist ()가 false를 반환하더라도 파일에서 읽을 수 있습니다.
atsjoo

1
결함을 재현하려면 정확히 무엇이 필요합니까?
user85421

1
이것은 MATLAB으로 작성되고 자바 애플리케이션으로 컴파일 된 함수를 호출하는 애플리케이션 내부입니다. "현재 디렉토리"를 변경하는 MATLAB 함수가 문제를 일으키는 것 같습니다. 파일 개체를 만들 때 절대 경로를 사용하고 있으므로 문제가되지는 않지만 문제가있는 것 같습니다. 물론 파일 객체의 절대 경로를 확인했으며 정확합니다 (matlab 함수가 현재 디렉토리를 변경하기 전과 동일).
atsjoo

7
혹시 원격 디렉토리 (예 : NFS 마운트)에 대해 작업하고 있습니까?
Tomer Gabel

답변:


42

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

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

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


17
방금 알아 냈습니다. bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id=4483097 분명히 파일에서 실행중인 작업은 현재 디렉터리에 대해 해결되고 getAbsolutePath는 user.dir에 대해 해결됩니다. 이 두 경로가 일치하지 않으면 충돌하는 결과가 발생합니다. 악마 같은!
Roman Zenka 2010

3
두 가지 방법을 모두 사용하여 파일이 있는지 확인하려고했지만 여전히 Windows 7에서만 거짓이 발생합니다! 어떤 생각?
Dejell

@Odelya : 어떤 IDE를 사용하고 있습니까? -Duser.dir은 무엇으로 설정되어 있습니까? 내 문제는 -Duser.dir을 현재 작업중인 디렉토리가 아닌 다른 디렉토리로 설정하여 발생했습니다.
Roman Zenka

1
동적 웹 프로젝트에서 작업하는 모든 사람의 경우 file.exists ()를 사용하면 예외가 발생합니다. file.getAbsoluteFile (). exists ()를 사용하여 WEB-INF 디렉토리에서 파일을 확인합니다 (Windows 7 전용이 아닌 일반 팁 ).
PS

이 답변과 의견에 대해 별도의 품질 보증을 만드는 것이 좋습니다
바토 - 베어 Tsyrenov

17

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 또는 절대 파일 경로가 될 수 있습니다.


5
나는 file:/C:/DEV/test.txt경로 이름으로 작동 할 것으로 기대하지 않습니다 . 경로명이 아닌 URL입니다. 어떤 사람이 실수를하지만, 영업 이익은 ... 가지고 있다는 증거가 없다
스티븐 C

15

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


20
흥미 롭군. 이것에 대해 확장 할 수 있습니까? 염두에두고있는 특정 권한은 무엇입니까?
Clément 2011

다음은 java.nio.file.AccessDeniedException 차단 기능으로 파일 / 디렉터리 존재에 도달 할 수 있습니다. 예를 들어, FAR 또는 다른 파일 탐색기에서 dir을 열어 둔 다음 모든 중첩 파일이있는 dir을 삭제하고이 dir의 존재를 확인하면 보관 된 임시 파일에 대해 AccessDeniedException (IOException 확장)을 얻을 수 있습니다. 이 경우 Files.exists는 IOException에 대해 false를 반환합니다.
beluha

11

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

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

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


1
3.5 년 후 같은 문제가 발생했습니다. cmd.com을 시작할 때마다 환경 변수를 구성하도록 자동 실행 스크립트를 설정했습니다. 현재 디렉토리도 변경하지 않았습니다. 일부 doskey 매크로와 환경 변수 만 있습니다. 자동 실행을 제거하고 파일의 명령을 수동으로 실행했는데 갑자기 File.exists ()가 올바르게 작동합니다.
Homr Zodyssey

1
OMG, 그것은 정말 작동합니다 (둘 다), 나는 단지 잘못된 파일을 멍청하게 확인하고 왜 그들 중 누구도 나를 위해 작동하지 않는지 알아보기 위해이 질문을 발견했습니다 :) BTW, ()다음 두 번째 줄에서 누락 된 것 같습니다 exists. )
RAM237

3

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


1
이 문제가 있었는데 문제는 C : \ test에 'testFile.txt'라는 txt 파일을 생성했다는 것입니다. 작동하지 않는 경로 C : \ test \ testFile.txt를 사용하여이 파일을 참조했습니다. 파일이 실제로 testFile.txt.txt로 저장 되었기 때문에 위의 솔루션에 대한 찬성 투표 (이전 질문이지만 수락 된 답변 없음!)
Theblacknight

God Windows는 너무 짜증납니다.
aafc 2014 년

3

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

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

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


제 경우에는 이것이 문제라고 생각하지 않습니다. 내 질문에서 언급했듯이 "Windows의"실행 "창에 전체 경로를 복사하여 붙여 넣을 수 있으며 파일이 제대로 열립니다."이는 파일이 실제로 존재한다는 것을 의미합니다.
atsjoo

3

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

당신이 말하는 경우

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

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

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

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


간단한 설명 : new 키워드를 사용하여 생성자를 호출 할 때마다 Object가 생성됩니다.이 경우 이름이 File 인 Class가 설명하는 Object와 동일합니다. 그래서 파일의 인스턴스가 아닙니다! = 서술자 :)
ceph3us

3

메서드를 호출해야 할 때마다 getAbsoluteFile () 호출을 처리하지 않으려면 이미 절대 경로를 사용하여 파일 인스턴스를 만드는 것이 좋습니다. 이것은 트릭을 수행해야합니다.

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

try-catch 블록 인 BTW로 둘러싸는 것이 좋습니다.


3

문제를 일반화하기 위해 URL / URI를 로컬 경로로 변환하는 동안 문제가 발생합니다.

Example: URL url = file:/D:/code%20repo%20sample/sample.txt

// To remove url reference
String localPath = url.getPath();  
> /D:/code%20repo%20sample/sample.txt

// Decoding reserved characters in url from hexadecimal to character
URLDecoder.decode(localPath, StandardCharsets.UTF_8.toString()); 
> /D:/code repo sample/sample.txt

도움이 되었기를 바랍니다.


0

모두 좋은 반응. Java C:가 Windows 의 루트 디렉토리에 액세스하는 데 문제가있는 것 같습니다 . 다른 디렉토리는 특별히 언급, 괜찮을하지만, 어떤 이유로해야 C:\하거나 C:또는 C:/오류를 줄 수 있습니다. 멘션을 트래핑 new File("C:");하고 new로 대체 하여이 매우 유사한 문제를 해결했습니다. File(System.getProperty("file.separator"));그렇지 않으면 파일 디렉토리로 "c :"라고 말하는 대신 "\"를 하드 코딩 할 수 있어야합니다. 우아하지는 않지만이 프로젝트에서 나를 위해 일을 완료했습니다.

도움이되기를 바랍니다. 올바른 해결책이 아닐 수도 있지만 적어도 저에게는 효과적이었습니다. 에 JRE 1.6, Win 7있습니다. 건배!

공손히,

안녕하세요.


0

실패하는 상황이 다른 사용자로 실행하고 Windows Vista / Windows 7을 사용하는 경우 VirtualStore로 인해 발생할 수 있습니다. Windows에서 권한이없는 사용자가 일반적으로 "쓰기"할 수 없도록하는 메커니즘입니다. 그러나 변경 사항은 각 사용자 계정에 대해 비공개 인 "% USERPROFILE % \ AppData \ Local \ VirtualStore \"에 저장됩니다.


1
나는 Windows xp x86에서 실행 중입니다
atsjoo

0

위에서 아무 것도 효과가 없을 때 나는 시도했습니다.

filePath = filePath.trim();

원치 않는 문자에서 문자열을 정리합니다.


-1

나는 최근에 이와 같은 문제를 발견했습니다. 내가 한 일은 거의 모든 곳에서 Netbeans를 제거하고 C 드라이브, 프로그램 파일, 업데이트, programData에서 netbeans 폴더를 삭제했습니다. 그런 다음 다시 설치하십시오. 이제 잘 작동합니다. 위의 작업을 수행하기 전에 netbeans 프로젝트 폴더를 백업하는 것을 잊지 마십시오.

도움이 되었기를 바랍니다.


-1

일부 IDE (일 수 있음) 및 또는 일부 OS (예 : 창)에서는 기본적으로 파일에 대한 쓰기 권한이 없습니다. 따라서 file.exists ()를 시도하면 false가 표시됩니다. 이 문제를 해결하려면 다음과 같이하십시오.

File에 대한 ref 변수가 f 인 경우 예 : File f = new File ( "path");

따라서 작동하게하려면 마우스로 f를 선택한 다음 검색 메뉴> 쓰기 권한> 작업 공간으로 이동합니다. 잘만되면 작동합니다.


-2

대신 다음과 같이 백 슬래시를 사용해야한다고 생각합니다.

파일 파일 = new File ( "C : \\ User \\ utilities \\ data \\ someTextFile.txt"); (오타가 아닌 두 개의 백 슬래시)

문제를 해결해야합니다 :)


3
문제는 절대 경로 대 상대 경로와 더 관련이 있다고 생각합니다. 슬래시는 Windows 경로의 경우에도 Java에서 유효합니다.
рüффп
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.