查找文件存储的目录
问题内容:
我试图找到一种方法来检测何时将闪存驱动器插入计算机。到目前为止,我发现的解决方案是轮询FileSystem#getFileStores
更改。这确实告诉我何时插入了闪存驱动器,但是据我所知,没有办法为其找到位置。FileStore#type
而FileStore#name
双方似乎非常不可靠作为其返回值是实现特定的,但他们似乎是可能返回的任何相关信息,可能有助于找到该目录的唯一方法FileStore
。
考虑到这一点,以下代码:
public class Test {
public static void main(String[] args) throws IOException {
for (FileStore store : FileSystems.getDefault().getFileStores()) {
System.out.println(store);
System.out.println("\t" + store.name());
System.out.println("\t" + store.type());
System.out.println();
}
}
}
给我这个输出:
/ (/dev/sda5)
/dev/sda5
ext4
/* snip */
/media/TI103426W0D (/dev/sda2)
/dev/sda2
fuseblk
/media/flashdrive (/dev/sdb1)
/dev/sdb1
vfat
事实证明,FileStore#type
返回驱动器的格式并FileStore#name
返回该驱动器的设备文件的位置。据我所知,唯一具有驱动器位置的toString
方法就是该方法,但是从中提取路径名似乎很危险,因为我不确定该特定解决方案在其他操作系统上的性能如何。
Java的未来版本。
我在这里缺少什么吗?或者仅仅使用Java不可能做到这一点吗?
系统信息:
$ java -version
java version "1.7.0_03"
OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu2)
OpenJDK Client VM (build 22.0-b10, mixed mode, sharing)
$ uname -a
Linux jeffrey-pc 3.2.0-24-generic-pae #37-Ubuntu SMP Wed Apr 25 10:47:59 UTC 2012 i686 athlon i386 GNU/Linux
问题答案:
在找到更好的解决方案之前,请先做以下临时工作:
public Path getRootPath(FileStore fs) throws IOException {
Path media = Paths.get("/media");
if (media.isAbsolute() && Files.exists(media)) { // Linux
try (DirectoryStream<Path> stream = Files.newDirectoryStream(media)) {
for (Path p : stream) {
if (Files.getFileStore(p).equals(fs)) {
return p;
}
}
}
} else { // Windows
IOException ex = null;
for (Path p : FileSystems.getDefault().getRootDirectories()) {
try {
if (Files.getFileStore(p).equals(fs)) {
return p;
}
} catch (IOException e) {
ex = e;
}
}
if (ex != null) {
throw ex;
}
}
return null;
}
据我所知,该解决方案仅适用于Windows和Linux系统。
您必须抓住IOException
Windows循环,因为如果CD驱动器中没有CD,则在尝试为其检索CD时会引发异常FileStore
。在遍历每个根之前可能会发生这种情况。