- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 JFileChooser,我需要以编程方式将其 currentDirectory 设置为包含多个 SMB 共享的网络主机(例如 \\blah
)。从技术上讲,这不是“目录”,而是代表可用共享列表的 shell 文件夹。
JFileChooser 可以毫无问题地导航到特定的共享(例如 \\blah\someShare
)但不能处理主机“目录”本身(例如 \\blah
).
用户可以通过“网络”shell 文件夹导航到 JFileChooser 中的此类“目录”,或者通过查找特定共享并导航到其父目录。调试显示该目录在后台表示为 Win32ShellFolder2
。到目前为止,我所有以编程方式设置 currentDirectory 的尝试都失败了。
new File("\\\\blah")
可以创建,但从 Java 的角度来看实际上并不存在。
chooser.setCurrentDirectory(new File("\\\\blah"));
失败,因为 JFileChooser
检查给定目录是否存在,并且 new File("\\\\blah").exists()
返回 false。
File dir = new File("\\\\blah").getCanonicalFile();
异常失败:
java.io.IOException: Invalid argument
at java.io.WinNTFileSystem.canonicalize0(Native Method)
at java.io.WinNTFileSystem.canonicalize(WinNTFileSystem.java:428)
at java.io.File.getCanonicalPath(File.java:618)
at java.io.File.getCanonicalFile(File.java:643)
File dir = ShellFolder.getShellFolder(new File("\\\\blah"));
异常失败:
java.io.FileNotFoundException
at sun.awt.shell.ShellFolder.getShellFolder(ShellFolder.java:247)
File dir = new Win32ShellFolderManager2().createShellFolder(new File("\\\\blah"));
异常失败:
java.io.FileNotFoundException: File \\blah not found
at sun.awt.shell.Win32ShellFolderManager2.createShellFolder(Win32ShellFolderManager2.java:80)
at sun.awt.shell.Win32ShellFolderManager2.createShellFolder(Win32ShellFolderManager2.java:64)
路径 dir = Paths.get("\\\\blah");
异常失败:
java.nio.file.InvalidPathException: UNC path is missing sharename: \\blah
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:118)
at sun.nio.fs.WindowsPathParser.parse(WindowsPathParser.java:77)
at sun.nio.fs.WindowsPath.parse(WindowsPath.java:94)
at sun.nio.fs.WindowsFileSystem.getPath(WindowsFileSystem.java:255)
at java.nio.file.Paths.get(Paths.java:84)
最佳答案
曾几何时,我遇到过这样的任务,我可以说这真的很烦人。一开始听起来很容易,但是当你开始挖掘和尝试时,越来越多的问题出现了。我想谈谈我的旅程。
据我了解,这里的问题是 \\ComputerName\
不是文件系统中的真实位置。它是一个抽象层,其内容取决于您的身份验证凭据。而且它仅适用于 Windows 机器,因此去那里会破坏 Java 的系统独立性法则。总结一下,File
对象无法指向任何东西。您可以使用 Samba 库 jcifs但在它们的实现中,类 SmbFile
需要用户身份验证,并且与 java File
类不兼容。所以你不能将它与 jFileChooser
一起使用。可悲的是,他们对更改它不感兴趣,您可以阅读 here .
我自己尝试开发一个文件包装器,它充当 File
和 SmbFile
类的混合体。但我放弃了,因为它给我带来了噩梦。
然后我有了写一个简单的 Dialog 的想法,列出以前用 jcifs
扫描的网络共享,让用户选择其中一个。然后应该显示一个带有所选共享的 jFileChooser
。
当我实现这个想法时,整个问题的 super 简单解决方案让我感到震惊。
由于指向 \\ComputerName\ShareName
并单击 更高一级
按钮绝对没有问题,因此必须可以重现此步骤。它是。实际上,在查看 jFileChooser
的底层时,我了解到像 MyComputer
或 Network
这样的地方是 ShellFolders
,它们是特殊情况File
对象。但是这些 Shell 文件夹是 protected ,不是 Java API 的一部分。
所以我不能直接实例化这些。但是我可以访问 FileSystemView
来处理文件系统上的系统相关 View ,例如为特殊位置创建这些 Shell 文件夹。
这么长的文字简短的回答。如果您知道一个共享名,请为该共享名创建一个文件。然后使用 FileSystemView
获取其父文件。瞧,你可以使用生成的 File
对象,它扩展了一个 ShellFolder
jFileChooser
.
File f = new File("\\\\ComputerName\\ShareFolder");
FileSystemView fsv = FileSystemView.getFileSystemView();
f = fsv.getParentDirectory(f);
JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(f);
最后一点:此解决方案不会要求您提供登录信息。因此,必须先在 Windows 中访问这些共享,然后才能在此处使用它们。
编辑:抱歉文本太长。除夕夜,我喝醉了。现在我想补充一点,我发现了相反的情况。
FileSystemView fsv = FileSystemView.getFileSystemView();
File Desktop = fsv.getRoots()[0];
在 Windows 系统上,这应该会为您提供桌面文件夹。如果您在此处列出所有文件:
for(File file : Desktop.listFiles())
System.out.println(file.getName());
您会注意到一些具有奇怪名称的条目:
::{20D04FE0-3AEA-1069-A2D8-08002B30309D} // My Computer
::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C} // Network
::{031E4825-7B94-4DC3-B131-E946B44C8DD5} // User Directory
我不知道这些代码是否适用于所有 Windows 版本,但它们似乎适用于 Windows7。因此,您可以使用它来获取 Network Shell 文件夹,然后获取具有共享的计算机。
File Network = fsv.getChild(Desktop, "::{F02C1A0D-BE21-4350-88B0-7367FC96EF3C}");
File Host = fsv.getChild(Network, "COMPUTERNAME"); // Must be in Capital Letters
这里的问题是这将花费大约 10 秒,因为会扫描网络文件夹中的内容。
关于java - 如何导航到 JFileChooser 中的网络主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33640908/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!