Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串[]{“时钟$”}//$非NLS-1$ }否则{ //Unix上只有前斜杠和空字符无效 //取自http://www.faqs.org/faqs/unix-faq/faq/part2/section-2.html 无效的_资源_字符=新字符[]{'/','\0',}; 无效的资源\u BASENAMES=null; 无效的\u资源\u全名=null; } } /** *如果给定名称是此操作系统上的有效资源名称,则返回true, *否则就错了。 */ 公共静态布尔值isNameValid(字符串名称){ //.和..在所有平台上都有特殊意义 如果(name.equals(“.”| | name.equals(“…”)/$NON-NLS-1$/$NON-NLS-2$ 返回false; if(已安装_PLATFORM.equals(PLATFORM.OS_WIN32)){ //空名称无效 final int length=name.length(); 如果(长度==0) 返回false; final char lastChar=name.charAt(长度-1); //以点结尾的文件名无效 如果(lastChar='.') 返回false; //以空格结尾的文件名被截断(bug 118997) if(Character.isWhitespace(lastChar)) 返回false; int dot=name.indexOf('.'); //在windows上,文件名后缀与名称有效性无关 字符串basename=dot==-1?名称:name.substring(0,dot); if(Arrays.binarySearch(无效的_资源_BASENAMES,basename.toLowerCase())>=0) 返回false; 返回Arrays.binarySearch(无效的\u资源\u全名,name.toLowerCase())_Java_File - Fatal编程技术网

Java 字符串[]{“时钟$”}//$非NLS-1$ }否则{ //Unix上只有前斜杠和空字符无效 //取自http://www.faqs.org/faqs/unix-faq/faq/part2/section-2.html 无效的_资源_字符=新字符[]{'/','\0',}; 无效的资源\u BASENAMES=null; 无效的\u资源\u全名=null; } } /** *如果给定名称是此操作系统上的有效资源名称,则返回true, *否则就错了。 */ 公共静态布尔值isNameValid(字符串名称){ //.和..在所有平台上都有特殊意义 如果(name.equals(“.”| | name.equals(“…”)/$NON-NLS-1$/$NON-NLS-2$ 返回false; if(已安装_PLATFORM.equals(PLATFORM.OS_WIN32)){ //空名称无效 final int length=name.length(); 如果(长度==0) 返回false; final char lastChar=name.charAt(长度-1); //以点结尾的文件名无效 如果(lastChar='.') 返回false; //以空格结尾的文件名被截断(bug 118997) if(Character.isWhitespace(lastChar)) 返回false; int dot=name.indexOf('.'); //在windows上,文件名后缀与名称有效性无关 字符串basename=dot==-1?名称:name.substring(0,dot); if(Arrays.binarySearch(无效的_资源_BASENAMES,basename.toLowerCase())>=0) 返回false; 返回Arrays.binarySearch(无效的\u资源\u全名,name.toLowerCase())

Java 字符串[]{“时钟$”}//$非NLS-1$ }否则{ //Unix上只有前斜杠和空字符无效 //取自http://www.faqs.org/faqs/unix-faq/faq/part2/section-2.html 无效的_资源_字符=新字符[]{'/','\0',}; 无效的资源\u BASENAMES=null; 无效的\u资源\u全名=null; } } /** *如果给定名称是此操作系统上的有效资源名称,则返回true, *否则就错了。 */ 公共静态布尔值isNameValid(字符串名称){ //.和..在所有平台上都有特殊意义 如果(name.equals(“.”| | name.equals(“…”)/$NON-NLS-1$/$NON-NLS-2$ 返回false; if(已安装_PLATFORM.equals(PLATFORM.OS_WIN32)){ //空名称无效 final int length=name.length(); 如果(长度==0) 返回false; final char lastChar=name.charAt(长度-1); //以点结尾的文件名无效 如果(lastChar='.') 返回false; //以空格结尾的文件名被截断(bug 118997) if(Character.isWhitespace(lastChar)) 返回false; int dot=name.indexOf('.'); //在windows上,文件名后缀与名称有效性无关 字符串basename=dot==-1?名称:name.substring(0,dot); if(Arrays.binarySearch(无效的_资源_BASENAMES,basename.toLowerCase())>=0) 返回false; 返回Arrays.binarySearch(无效的\u资源\u全名,name.toLowerCase()),java,file,Java,File,我发现,在java 7和更高版本中,有一个名为的类,它有一个名为get的方法,它接受一个或多个字符串并抛出 -如果路径字符串无法转换为路径 请,不再存在()答案,这没有帮助。我正在检查一个文件是否可能存在。@MasterPeter:试着改写你的问题。最初看起来您想知道文件是否存在,而实际上您需要知道文件名是否有效。我已经更改了标题,但没有触及问题的措辞。似乎相关:为什么这被标记为重复?指向副本的链接表示正在检查目录。这里的问题是关于检查一个文件。但是,您想删除刚才创建的文件,因为函数OKtoRe

我发现,在java 7和更高版本中,有一个名为的类,它有一个名为
get
的方法,它接受一个或多个
字符串并抛出

-如果路径字符串无法转换为路径



请,不再存在()答案,这没有帮助。我正在检查一个文件是否可能存在。@MasterPeter:试着改写你的问题。最初看起来您想知道文件是否存在,而实际上您需要知道文件名是否有效。我已经更改了标题,但没有触及问题的措辞。似乎相关:为什么这被标记为重复?指向副本的链接表示正在检查目录。这里的问题是关于检查一个文件。但是,您想删除刚才创建的文件,因为函数OKtoRename不应该实际更改文件系统,只需回答文件名是否有效。@Matt:Ooor,您只需创建文件,如果createNewFile返回false,则表示文件名无效(…或无法创建:-S)很抱歉把重点放在并发性上;我最初将其解释为主要问题。但是,实际上创建文件是查看名称是否有效的唯一方法。如果您有兴趣尝试这一途径,可以查看我关于不同平台上保留名称的问题。@Matt Poush,@MasterPeter:我不认为erickson建议创建一个文件,然后将其删除。似乎正确的方法是尝试在一个步骤中重命名该文件,而不是首先测试“确定”。如果该步骤失败,则不确定。如果成功,则确定。@erickson感谢您对此进行研究。您关于使用路径的建议类似于f.getCanonicalPath()在一个不同的答案中提出的解决方案,我从那以后就采用了,并且做了我想做的事情-但是有一条评论说这个答案在Android上不起作用。我将尝试nio功能,这可能是未来的发展方向。人们可能还应该检查文件名的长度。但是不要忘记关键字,比如尝试cre吃了一个名为COM、COM1、COM2、PRN等的文件(至少在Windows平台上是这样),我甚至没有考虑过……虽然我意识到这不是一个完整的解决方案,但这对我来说效果很好(其中只有一部分文件名是动态的,所以关键字没有风险)。感谢您编译此列表。添加了一条警告,表明这只是部分解决方案。@ZsoltTörök感谢您提供此列表。本文可能对那些寻求Windows官方文档的人有所帮助:抱歉,但是如果文件名中有星号,您的代码将不会有帮助。System.out.println(urlcoder.encode(“hello world”),“UTF-8”);打印出hello+world,这不是一个有效的文件名。太好了!。你是对的,实际上我正要问这个问题。:)哦,糟糕,我没有看到你的答案……很好的解决方案,但不幸的是,它在Android上不起作用:-(即f.getCanonicalPath()不为不正确的文件名引发异常依赖于一个很好的函数不是很危险吗?但请注意(即使在Windows上)这并不适用于
file
是一个(有效)目录名的情况,例如,以斜杠结尾。如果您想排除这种情况,请将第4+5行替换为
返回f.getCanonicalFile().getName().equals(文件)
.What@Arend建议加上检查f.isFile()首先,否则有效目录可能会通过。这会导致目录遍历安全错误。如果文件名来自第三方,则这不是一种安全的编码方式。@VishnuPrasadKallummel目录遍历包括利用用户提供的输入文件名的安全验证/清理不足。您应该在你的应用程序中有一个不同的层来执行消毒处理。你能解释一下为什么你认为在一个验证给定路径有效的方法中应该混合用户输入验证吗?这样的方法将是一个目录遍历问题。但是如果你有一个额外的层,你在这个方法被调用之前检查。看起来还可以。这是一个自发的评论,因为我在搜索相同的文件时没有实际创建一个文件,然后删除它。值得注意的是:在基于unix的系统上,这些是有效的文件名:“hi!”,“hello file”,“真的吗?”在工作中,我们发现这种方法允许这些
boolean OKtoRename(String oldName, String newName)
if (new File(newName).isFile()) { 
    return false; 
}
private static final char[] ILLEGAL_CHARACTERS = { '/', '\n', '\r', '\t', '\0', '\f', '`', '?', '*', '\\', '<', '>', '|', '\"', ':' };
String validName = URLEncoder.encode( fileName , "UTF-8");

File newFile = new File( validName );
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;
}
public static boolean isFilenameValid(String file) {
  File f = new File(file);
  try {
    f.getCanonicalPath();
    return true;
  } catch (IOException e) {
    return false;
  }
}
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;
   }
}