2012-04-23 1 views
4

JFileChooser를 사용하여 디렉토리를 선택하는 어플리케이션이 있습니다. 이 응용 프로그램에서는 심볼 링크를 처리하려고하지 않으므로 여러 플랫폼에서 실행하고 싶습니다. 따라서 코드는 선택된 파일이 심볼 링크인지 여부를 판별하고 오류 대화 상자를 표시합니다.FileChooser는 GUI 선택과 타이핑 파일명을 비교합니다

다음은 JFileChooser에서 파일을 가져 오는 코드입니다.

윈도우 7에
public static boolean isSymbolic(File f) 
{ 
    try 
    { 
    String absolute = f.getAbsolutePath(); 
    String canonical = f.getCanonicalPath(); 
    return !(absolute.equals(canonical)); 
    } 
    catch (IOException ioe) 
    { 
    return false; 
    } 
} 

: 사용자가 마우스를 사용하여 지정된 디렉토리를 선택하면,이 잘 작동

public File getDirectoryChoice(String buttonText, String currentDirectory) 
{ 
    File chosenFile = null; 
    if (fileChooser == null) { fileChooser = new JFileChooser(); } 
    if (currentDirectory != null) 
    { fileChooser.setCurrentDirectory(new File(currentDirectory)); } 
    fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
    fileChooser.setApproveButtonText(buttonText); 
    int returnValue = fileChooser.showOpenDialog(mainFrame); 
    if (returnValue == JFileChooser.APPROVE_OPTION) 
    { 
    chosenFile = fileChooser.getSelectedFile(); 
    } 
    return chosenFile; 
} 

여기에 내가 선택한 파일이 심볼릭 링크인지를 결정하는 데 사용하는 코드입니다 . 사용자가 파일 이름 텍스트 상자에 동일한 디렉토리 이름을 입력하면 두 번째 코드 조각은 절대 경로와 표준 경로가 동일하지 않음을 나타냅니다. 사용자가 후행 백 슬래시를 입력했는지 여부는 중요하지 않습니다.

디버거에서 'return'명령문 행을 중지하고 두 문자열의 세부 사항을 보면 절대 경로 문자열의 해시 값이 큰 음수가되고 표준 문자열의 해시 값 그 이유는 모르겠다. 사실 이클립스 (Eclipse) 디버거의 버크인지 궁금하다.

누구나 왜이 차이가 있을지 말해 줄 수 있습니까?

답변

2

정확히 일치하면을 JFileChooser에서 반환하는 것과 똑같이 입력했는지 다시 확인하십시오.

나는 이것을 시도했지만 생각하지 않고 c:\temp을 입력했습니다. 테스트와 마찬가지로 isSymbolic() 메서드는 true을 반환했습니다. 그러나 더 자세히 살펴보면 파일 선택기에서이 경로를 선택했을 때 C:\temp이 대신 반환됩니다 (대문자는 C입니다). "Java 1.6 - determine symbolic links"

if (System.getProperty("os.name").toLowerCase().indexOf("win") >= 0) 
     return !(absolute.equalsIgnoreCase(canonical)); 
    else 
     return !(absolute.equals(canonical)); 

또한이 관련 질문을보고 할 수 있습니다 :

는 추한 그래서 비록이 같은 특별한 경우에 무언가를 추가 할 수 있습니다. 도움이 될만한 답변이 많이 있습니다.

+0

자본 C를 - 당신이 얼마나 많은 경험이 중요하지 않습니다, 당신은 여전히 ​​(분명히)에 의해 잡힐 수 있습니다. – arcy

1

absolute.hashCode()canonical.hashCode()을 Eclipe의 표현식 창에 추가하면 올바른 값 (0이 아닌 값)을 모두 볼 수 있습니다. 문자열은 hash 멤버가 0으로 초기화됩니다. hashCode()이 실행되면 올바른 값으로 업데이트됩니다.

그럼 아마도 absolute 문자열의 계산 된 해시이고 아직 canonical 문자열의 계산 된 해시가 아닙니다.

String.hashCode()에 중단 점을 넣으면 Windows에서 getCanonicalPath()absolute.hashCode()을 트리거합니다. Windows에서 getCanonicalPath()을 구현하면 정규화 된 결과가 캐시 된 것처럼 보입니다. WinNTFileSystem.canonicalize() 사이의 어딘가에서 캐시 된 결과 맵의 조회가 absolute.hashCode()을 트리거합니다.

그래서 당신이 isSymbolic()return 문에 설정하는 것이 중단 점에서, absolute 유효한 해시 코드를 가지고 있으며, canonical는 0으로 여전히있다.여기

f.getCanonicalPath()의 결과로 absolute.hashCode() 실행 보여 스택 추적입니다 :

String.hashCode() line: 1482 [local variables unavailable] 
ExpiringCache$1(HashMap<K,V>).getEntry(Object) line: 344  
ExpiringCache$1(LinkedHashMap<K,V>).get(Object) line: 280 
ExpiringCache.entryFor(String) line: 83 
ExpiringCache.get(String) line: 58 
WinNTFileSystem(Win32FileSystem).canonicalize(String) line: 377 
File.getCanonicalPath() line: 559 
Test.isSymbolic(File) line: 25 
Test.main(String[]) line: 16 
+0

팁을 주셔서 감사합니다. – arcy