사례 민감성 때문에 Linux에서 Java를 실행할 때 FilenotFound 예외를 피하는 방법은 무엇입니까?

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

문제

내 웹 응용 프로그램은 Windows에서 실행됩니다. Linux에서도 앱을 실행하고 싶습니다. 경로 분리기 등과 같은 대부분의 문제를 극복 한 것 같습니다.

진짜 문제는 이제 내가 얻는 것입니다 FileNotFoundException Java 코드가 파일을 열려고 할 때 Abc.txt 단지 abc.txt 존재합니다. :(

파일이 많기 때문에 모든 파일 이름을 소문자 나 대문자로 변경할 수는 없습니다. 코드를 변경하지 않고 이것을 피할 수있는 가능한 방법은 무엇입니까?

도움이 되었습니까?

해결책

이것을 피할 방법이 없습니다 java.io.File API는 시스템 의존적입니다. Linux/Unix에서 파일을 조작 할 때 올바른 케이스를 사용해야합니다. 실제로, 나의 조언/솔루션은 Windows에서 개발 중에 엄격하고 휴대용 대회를 따르는 것입니다 (예 : 소문자 파일 이름 만 사용하거나 더 나은 프로그래밍 방식으로 액세스 할 때 정확한 파일 이름을 사용하십시오). 솔직히 말해서, 당신이 왜로드하려고하는지 이해가 안 돼요 Abc.txt 파일 이름이있을 때 abc.txt. 이것은 Linux/Unix 문제보다는 나쁜 습관 (Windows에서 너무 많은 시간을 보내면 가르치는)입니다.

다른 팁

고치세요!

당신이 고치기 위해 당신이 고치기 위해 고안하는 모든 계획은 장기적으로 더 나빠질 것입니다.

글쎄, 우선 나는 당신을 생각합니다 ~해야 한다 해결 방법을 사용하지 않고 일관된 이름 지정 체계로 이동하는 것을 고려하십시오.

어쨌든, 어떻습니까? 모든 파일 이름을 읽고지도에 넣습니다. 소문자 이름이 키로 포함되어 있습니까? 그럼 당신은 할 수 있습니다 지도에서 올바른 파일 이름을 찾으십시오.

이를 통해 충돌을 감지 할 수 있습니다. 예를 들어, 동일한 소문자 표현이있는 동일한 디렉토리에서 "filea.txt"및 "filea.txt"라는 두 파일을 감지 할 수 있습니다.이 경우 문제를 해결해야한다는 것을 알고 있습니다. 완전히 다른 방법입니다 (어느 쪽을 열고 싶은지 알아야하기 때문에 모호하고 그러한 해결 방법은 그렇게하지 않을 것입니다).

파일이 Linux에서 혼합 된 케이스라고 가정하면 이에 대한 간단한 대답은 없습니다.

내가 생각할 수있는 가장 좋은 것은 응용 프로그램에 관련 디렉토리를 나열하고 실제 Linux 파일 이름의 메모리 데이터 구조를 작성하는 것입니다. 그런 다음 대소 문자를 사용하지 않는 파일을 열면 PathName을 구성 요소로 나누고 케이스에 민감한 검색을 사용하여 메모리 내 트리를 검색하고 실제 (케이스에 민감한) PathName을 개방하는 데 사용합니다.

이것의 문제점은 동일한 Linux 디렉토리에 "foo.txt"및 "foo.txt"가있는 경우에 대처할 수 없다는 것입니다.

그러나 최상의 솔루션은 애플리케이션이 케이스에 민감한 PathNames에서 작동하도록 응용 프로그램을 변경하는 것입니다.

왜 많은 파일을 변경할 수 없습니까? 파일의 양이 실제로 당신을 뒤로 유지하는 유일한 것인 경우, 단순히 소문자로 이름을 바꾸는 작은 스크립트를 작성하십시오.

파일의 사례 변경을 일으키는 원인이 무엇인지 확실하지 않습니다. 모든 파일이 Linux의 소문자 인 경우 Windows에서는 혼합 된 케이스 인 경우 파일 이름을 소문자로 변환 할 수 있습니다.

new File(filename.toLowerCase())

끔찍한 런타임 성능을 가지고 있지만 구현하기가 매우 간단한 솔루션이 있습니다.

바꾸다 new FileReader(name) 같은 것

openFile(name);

public FileReader openFile(String name) throws FileNotFoundException {
  File dir = (new File(name)).getParentFile();
  for (File f : dir.listFiles()) {
    if (f.getName().equalsIgnoreCase(name)) {
    return new FileReader(f);
  }
  throw new FileNotFoundException("File not found: " + name);
}

이 코드를 컴파일하지 않았으며 오타와 버그가있을 수 있습니다. 나는 당신에게 고치기 위해 그들을 맡깁니다.

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