JFileChooser を使用してディレクトリを選択するアプリケーションがあります。このアプリでは、シンボリック リンクを処理しようとはせず、複数のプラットフォームで実行したいと考えています。したがって、コードは、選択されたファイルがシンボリック リンクであるかどうかを判断しようとし、シンボリック リンクである場合はエラー ダイアログを表示します。
JFileChooser からファイルを取得するコードを次に示します。
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;
}
選択したファイルがシンボリックリンクかどうかを判断するために使用するコードは次のとおりです。
public static boolean isSymbolic(File f)
{
try
{
String absolute = f.getAbsolutePath();
String canonical = f.getCanonicalPath();
return !(absolute.equals(canonical));
}
catch (IOException ioe)
{
return false;
}
}
Windows 7 の場合: ユーザーがマウスを使用して特定のディレクトリを選択すると、問題なく動作します。ユーザーがファイル名テキスト ボックスに同じディレクトリ名を入力すると、2 番目のコード スニペットは、絶対パスと標準パスが同じでないことを示します。ユーザーが末尾のバックスラッシュを入力するかどうかは問題ではありません。
これを「return」ステートメント行でデバッガーで停止し、2 つの文字列の詳細を確認すると、絶対パス文字列のハッシュ値は大きな負の数であり、正規文字列のハッシュ値は 0 です。それがなぜなのかわかりません。実際、(Eclipse) デバッガーの癖ではないかと思います。
なぜこの違いがあるのか 誰か教えてもらえますか?