Javaかるかどうかを確認するファイル名が正当なものか?[重複]

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

  •  23-08-2019
  •  | 
  •  

質問

私のJavaアプリケーション私名を変更したいファイルのファイル名を指定文字列パラメータとします。する方法があり

boolean OKtoRename(String oldName, String newName)

分で出られるかどうかをチェックしますnewNameんはすでに他のファイルとしてはさんで埋設定しています。

今起こってくるということになおそらくnewNameの文字列がないを示す有効なファイル名です。していかないといけないと思い追加することを確認の方法

if (new File(newName).isFile()) { 
    return false; 
}

るのではありませんからの権利について教えてください、ほとんどの場合、newFileがまだ存在していないためですが OKtoRenameの機能はfalseを返します。

私は、英語上級者の方にお尋ねしたい法知っていないのではないで、java.io.ファイルオブジェクト) canExist()?たいていのインタビューをチェックregexかどうかを確認するためにnewFile文字列が含まれない無効な文字(例えば?, *,",:)?思がある場合にこのような機能それは、あなたがかけがえのないJDKではとて言ってくれたり、覚えたての場合は文字列かを示す有効なファイル名です。

役に立ちましたか?

解決

createNewFile() <を使用します/ A>、それはまだ存在しない場合にのみ、アトミックファイルを作成しますました。

ファイルが作成されている場合は、

、名前は有効であり、それは既存のファイルをつかうされていません。あなたはその後、ファイルを開いて、効率的にFileChannel.transferXXX操作で一方から他方へデータをコピーすることができます。

一般的に、チェックおよび作成はアトミックでなければならないことを心に留めておくべき重要なこと。あなたが最初の操作が安全であるかどうかを確認した場合、その後、別のステップとしての動作を実行し、条件が操作は危険な作り、その間に変更された可能性がある。

の思考のための追加の食品は、この関連の記事でご利用いただけます:「移動/コピー操作でJavaの。 "

<時間>

のアップデート:

この答えので、NIO.2のAPIは、ファイルシステムでより多くの対話を追加した、導入されている。

あなたは対話型プログラムを持って、そのファイルが潜在的に有効であるかどうか、各キーストロークの後に検証するとします。たとえば、エントリが「保存」を押した後にエラーダイアログをポップアップではなく、有効である場合にのみ、「保存」ボタンを有効にする必要があります。上記の私の提案が必要となる不要なファイルの多くの削除を作成し、確保することが混乱のように思える。

NIO.2を使用すると、ファイルシステムの無効な文字を含むPathインスタンスを作成することはできません。 InvalidPathExceptionはできるだけ早くあなたがPathを作成しようとして発生します。

ただし、Windows上で「PRN」などの有効な文字で構成される違法名を、検証するためのAPIはありません。回避策として、実験は(例えばFiles.getLastModifiedTime()を、使用して)属性にアクセスしようとすると、不正なファイル名を使用すると、個別の例外を発生させることを示しました。

あなたが存在しないファイルのための法的な名前を指定した場合は、

、あなたは何の例外を取得していません。

あなたが存在しないファイルのための法的な名前を指定した場合は、

、それはNoSuchFileExceptionを発生させます。

あなたは違法な名前を指定した場合は、

FileSystemExceptionが発生します。

しかし、これは非常にkludgeyようで、他のオペレーティングシステムでは信頼できない可能性があります。

他のヒント

組み立てを行った一覧の違法ファイル名の文字を検討UNIX、Mac OS XシステムやWindowsシステムと)に基づくいくつかのオンライン研究のカップルで利用するのもおすすめです。場合、新しいファイル名を含むこれらがリスクがない場合があったので、それを有効にするすべてのプラットフォーム.

private static final char[] ILLEGAL_CHARACTERS = { '/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':' };

編集: を強調しておきたいと思い、この なな完成されたソリューション:としてコメント投稿者を指摘ものでこのテストファイル名が続き窓にキーワードのようなCOM PRN。ただし、ファイル名を含むこれらの文字やすこととなるでしょうがトラブルなクロスプラットフォームな環境です。

ここのシステム固有の方法提案されます。

public static boolean isFilenameValid(String file) {
  File f = new File(file);
  try {
    f.getCanonicalPath();
    return true;
  } catch (IOException e) {
    return false;
  }
}

Eclipse用開発する場合は、チェックアウトorg.eclipse.core.internal.resources.OS

public abstract class OS {
   private static final String INSTALLED_PLATFORM;

   public static final char[] INVALID_RESOURCE_CHARACTERS;
   private static final String[] INVALID_RESOURCE_BASENAMES;
   private static final String[] INVALID_RESOURCE_FULLNAMES;

   static {
      //find out the OS being used
      //setup the invalid names
      INSTALLED_PLATFORM = Platform.getOS();
      if (INSTALLED_PLATFORM.equals(Platform.OS_WIN32)) {
         //valid names and characters taken from http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp
         INVALID_RESOURCE_CHARACTERS = new char[] {'\\', '/', ':', '*', '?', '"', '<', '>', '|'};
         INVALID_RESOURCE_BASENAMES = new String[] {"aux", "com1", "com2", "com3", "com4", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ 
               "com5", "com6", "com7", "com8", "com9", "con", "lpt1", "lpt2", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
               "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "nul", "prn"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$ //$NON-NLS-9$
         Arrays.sort(INVALID_RESOURCE_BASENAMES);
         //CLOCK$ may be used if an extension is provided
         INVALID_RESOURCE_FULLNAMES = new String[] {"clock$"}; //$NON-NLS-1$
      } else {
         //only front slash and null char are invalid on UNIXes
         //taken from http://www.faqs.org/faqs/unix-faq/faq/part2/section-2.html
         INVALID_RESOURCE_CHARACTERS = new char[] {'/', '\0',};
         INVALID_RESOURCE_BASENAMES = null;
         INVALID_RESOURCE_FULLNAMES = null;
      }
   }

   /**
    * Returns true if the given name is a valid resource name on this operating system,
    * and false otherwise.
    */
   public static boolean isNameValid(String name) {
      //. and .. have special meaning on all platforms
      if (name.equals(".") || name.equals("..")) //$NON-NLS-1$ //$NON-NLS-2$
         return false;
      if (INSTALLED_PLATFORM.equals(Platform.OS_WIN32)) {
         //empty names are not valid
         final int length = name.length();
         if (length == 0)
            return false;
         final char lastChar = name.charAt(length-1);
         // filenames ending in dot are not valid
         if (lastChar == '.')
            return false;
         // file names ending with whitespace are truncated (bug 118997)
         if (Character.isWhitespace(lastChar))
            return false;
         int dot = name.indexOf('.');
         //on windows, filename suffixes are not relevant to name validity
         String basename = dot == -1 ? name : name.substring(0, dot);
         if (Arrays.binarySearch(INVALID_RESOURCE_BASENAMES, basename.toLowerCase()) >= 0)
            return false;
         return Arrays.binarySearch(INVALID_RESOURCE_FULLNAMES, name.toLowerCase()) < 0;
      }
      return true;
   }
}

これは私がこれを実装する方法です。

public boolean isValidFileName(final String aFileName) {
    final File aFile = new File(aFileName);
    boolean isValid = true;
    try {
        if (aFile.createNewFile()) {
            aFile.delete();
        }
    } catch (IOException e) {
        isValid = false;
    }
    return isValid;
}

私にはOS依存の問題であるように思われます。あなたは、単にファイル名にいくつかの無効な文字をチェックすることをお勧めします。 \ /:* Windowsは、ファイルの名前を変更しようとすると、そのファイルは次の文字は使用できませんというメッセージをポップにこれをしますか? <> | 私はあなたの質問がされたかどうかわからないよ「私のために仕事をしているライブラリはありますか?」その場合、私は知りません。

だから、java7以降がクラスと呼ばれ Paths るという手法 get るり Stringsおよび投

InvalidPathException この場合は、パス文字列に変換されませんパス

使用

String validName = URLEncoder.encode( fileName , "UTF-8");

File newFile = new File( validName );

作業を行います。

私はちょうど今日発見しました。私はそれが100%の時間を動作するかどうかわからないんだけど、今のところ、私は有効なファイル名を作成することができました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top