A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李建锋 黑马帝   /  2011-12-12 22:55  /  2854 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李建锋 于 2011-12-14 18:32 编辑

为什么java在Windows下面显示的都是隐藏文件??
public class ListFilesDemo {

        /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
       
       
//        listFilesDemo(new File("H:\\"));
        for(File f:File.listRoots())
        {
            
            System.out.println(f.toString()+f.isHidden());
        }
       
       
    }

评分

参与人数 1技术分 +1 收起 理由
admin + 1 问题已解决,把标题修改成已解决!.

查看全部评分

6 个回复

倒序浏览
为什么java在Windows下面显示的都是隐藏文件????
没看明白
  1. import java.io.File;

  2. public class ListFilesDemo {
  3.          /**
  4.      * @param args
  5.      * @throws IOException
  6.      */
  7.     public static void main(String[] args) throws Exception {
  8.         
  9.         
  10. //        listFilesDemo(new File("H:\\"));
  11.         for(File f:File.listRoots())
  12.         {
  13.             
  14.             System.out.println(f.toString()+f.isHidden());
  15.         }
  16.     }
  17. }
复制代码
你这段代码 输出的是 文件系统根的根目录 是否可用
例如:
   我的电脑就是:
C:\true
D:\true
E:\true
F:\true
G:\false驱动盘
H:\false驱动盘

回复 使用道具 举报
吴上储 发表于 2011-12-13 11:46
为什么java在Windows下面显示的都是隐藏文件????
没看明白你这段代码 输出的是 文件系统根的根目录 是否 ...

恩,就是的,那你说怎么遍历指定位置的文件,要防止空指针异常 !
回复 使用道具 举报
王冀 黑马帝 2011-12-13 12:37:23
板凳
本帖最后由 王冀 于 2011-12-13 13:02 编辑

File的isHidden代码:
  1. public boolean isHidden() {
  2.         SecurityManager security = System.getSecurityManager();
  3.         if (security != null) {
  4.             security.checkRead(path);
  5.         }
  6.         return ((fs.getBooleanAttributes(this) & FileSystem.BA_HIDDEN) != 0); //调用了FileSystem类的native 方法getBooleanAttributes
  7. }
复制代码
注:FileSystem.BA_HIDDEN = 0x8
  FileSystem.BA_EXISTS = 1;
  FileSystem.BA_REGULAR = 2;
  FileSystem.BA_DIRECTORY = 4;
getBooleanAttributes的C代码:
  1. JNIEXPORT jint JNICALL
  2. Java_java_io_WinNTFileSystem_getBooleanAttributes(JNIEnv *env, jobject this,jobject file)
  3. {
  4.     jint rv = 0;
  5.     jint pathlen;

  6. #define SPECIALFILE_NAMELEN 12

  7.     WCHAR *pathbuf = fileToNTPath(env, file, ids.path);
  8.     WIN32_FILE_ATTRIBUTE_DATA wfad;
  9.     if (pathbuf == NULL)
  10.         return rv;
  11.     if (!isReservedDeviceNameW(pathbuf)) {
  12.         if (GetFileAttributesExW(pathbuf, GetFileExInfoStandard, &wfad)) {
  13.             rv = (java_io_FileSystem_BA_EXISTS            //文件存在
  14.                   | ((wfad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  //是否是文件夹
  15.                      ? java_io_FileSystem_BA_DIRECTORY
  16.                      : java_io_FileSystem_BA_REGULAR)
  17.                   | ((wfad.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)        //是否隐藏
  18.                      ? java_io_FileSystem_BA_HIDDEN : 0));
  19.         } else {
  20.             if (GetLastError() == ERROR_SHARING_VIOLATION) {
  21.                 rv = java_io_FileSystem_BA_EXISTS;
  22.                 if ((pathlen = wcslen(pathbuf)) >= SPECIALFILE_NAMELEN &&
  23.                     (_wcsicmp(pathbuf + pathlen - SPECIALFILE_NAMELEN,
  24.                               L"pagefile.sys") == 0) ||
  25.                     (_wcsicmp(pathbuf + pathlen - SPECIALFILE_NAMELEN,
  26.                               L"hiberfil.sys") == 0))
  27.                   rv |= java_io_FileSystem_BA_REGULAR;
  28.             }
  29.         }
  30.     }
  31.     free(pathbuf);
  32.     return rv;
  33. }
复制代码
其中:
  1. static BOOL isReservedDeviceNameW(WCHAR* path) {
  2. #define BUFSIZE 9
  3.     WCHAR buf[BUFSIZE];
  4.     WCHAR *lpf = NULL;
  5.     DWORD retLen = GetFullPathNameW(path,
  6.                                    BUFSIZE,
  7.                                    buf,
  8.                                    &lpf);
  9.     if ((retLen == BUFSIZE - 1 || retLen == BUFSIZE - 2) &&
  10.         buf[0] == L'\\' && buf[1] == L'\\' &&
  11.         buf[2] == L'.' && buf[3] == L'\\') {
  12.         WCHAR* dname = _wcsupr(buf + 4);
  13.         if (wcscmp(dname, L"CON") == 0 ||
  14.             wcscmp(dname, L"PRN") == 0 ||
  15.             wcscmp(dname, L"AUX") == 0 ||
  16.             wcscmp(dname, L"NUL") == 0)
  17.             return TRUE;
  18.         if ((wcsncmp(dname, L"COM", 3) == 0 ||
  19.              wcsncmp(dname, L"LPT", 3) == 0) &&
  20.             dname[3] - L'0' > 0 &&
  21.             dname[3] - L'0' <= 9)
  22.             return TRUE;
  23.     }
  24.     return FALSE;
  25. }
复制代码
查阅wfad.dwFileAttributes的FILE_ATTRIBUTE_HIDDEN:有这样的描述:The file or directory is hidden. It is not included in an ordinary directory listing.

在我的电脑上NTFS文件系统的显示true,其他为false

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
王冀 发表于 2011-12-13 12:37
File的isHidden代码:注:FileSystem.BA_HIDDEN = 0x8
  FileSystem.BA_EXISTS = 1;
  FileSystem.BA_REGUL ...

楼主辛苦了,谢谢!
回复 使用道具 举报
本帖最后由 吴上储 于 2011-12-13 13:08 编辑
李建锋 发表于 2011-12-13 12:19
恩,就是的,那你说怎么遍历指定位置的文件,要防止空指针异常 !

  1. package com.itheima.find;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;

  6. /**
  7. * 读取目录及子目录下指定文件名的路径 并放到一个数组里面返回遍历
  8. * @author 转自 zdz8207
  9. *
  10. */
  11. public class FildFile {
  12. public static void main(String[] args) {
  13. //List arrayList = FileViewer.getListFiles("d:/com","html",true);

  14. //读取f:/abc下的以txt 结尾的文件 如有子目录,包含之(后缀名为null则为所有文件)
  15. //List arrayList = FileViewer.getListFiles("f:/abc","txt",true);

  16. //经试验,后缀不能不填写,否则编译不通过,提示“FileViewer.java:17: 非法的表达式开始”。
  17. //另外后缀为""时的情况需要 增加到IF 里去,否则 后缀为""时,不会显示所有文件
  18. List arrayList = FildFile.getListFiles("E:/music","mp3",true); //路径 + 文件类型  + 是否遍历子目录
  19. if(arrayList.isEmpty())
  20. {
  21. System.out.println("没有符号要求的文件");
  22. }
  23. else
  24. {
  25. String message = "";
  26. message +="符号要求的文件数:" + arrayList.size() + "\r\n";
  27. System.out.println(message);

  28. for (Iterator i = arrayList.iterator(); i.hasNext();)
  29. {
  30. String temp = (String) i.next();
  31. System.out.println(temp);
  32. message += temp + "\r\n";
  33. }
  34. //将显示的文件路径写到指定的文件里,若文件不存在,则提示IO异常
  35. //java.io.FileNotFoundException: d:\ajax\menu.txt (系统找不到指定的路径。)
  36. //如果 加个文件是否存在的判断,如不存在就在当前目录新建一个,则更好。
  37. appendMethod("d:/menu.txt",message); //查询结果保存在d:/menu.txt
  38. }
  39. }
  40. public static List<String> fileList = new ArrayList<String>();

  41. /**
  42. *
  43. * @param path 文件路径
  44. * @param suffix 后缀名
  45. * @param isdepth 是否遍历子目录
  46. * @return
  47. */
  48. public static List getListFiles(String path, String suffix, boolean isdepth)
  49. {
  50. File file = new File(path);
  51. return FildFile.listFile(file ,suffix, isdepth);
  52. }

  53. public static List listFile(File f, String suffix, boolean isdepth)
  54. {
  55. //是目录,同时需要遍历子目录
  56. if (f.isDirectory() && isdepth == true)
  57. {
  58. File[] t = f.listFiles();
  59. for (int i = 0; i < t.length; i++)
  60. {
  61. listFile(t[i], suffix, isdepth);
  62. }
  63. }
  64. else
  65. {
  66. String filePath = f.getAbsolutePath();

  67. //System.out.println("suffix = "+suffix);
  68. if(suffix =="" || suffix == null)
  69. {
  70. //后缀名为null则为所有文件
  71. fileList.add(filePath);
  72. }
  73. else
  74. {
  75. int begIndex = filePath.lastIndexOf(".");//最后一个.(即后缀名前面的.)的索引
  76. String tempsuffix = "";

  77. if(begIndex != -1)//防止是文件但却没有后缀名结束的文件
  78. {
  79. tempsuffix = filePath.substring(begIndex + 1, filePath.length());
  80. }

  81. if(tempsuffix.equals(suffix))
  82. {
  83. fileList.add(filePath);
  84. }
  85. }

  86. }

  87. return fileList;
  88. }

  89. /**
  90. * 方法追加文件:使用FileWriter
  91. * @param fileName
  92. * @param content
  93. */
  94. public static void appendMethod(String fileName, String content)
  95. {
  96. try
  97. {
  98. //打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
  99. FileWriter writer = new FileWriter(fileName, true);
  100. writer.write(content + "\r\n");
  101. writer.close();
  102. }
  103. catch (IOException e)
  104. {
  105. e.printStackTrace();
  106.         }
  107. }
  108. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
admin + 2 赞一个!

查看全部评分

回复 使用道具 举报
李建锋 黑马帝 2011-12-13 13:12:58
7#
吴上储 发表于 2011-12-13 13:06

辛苦大哥了,非常感谢!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马