有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用SWT filedialog复制多个文件

我正在运行一个传输文件程序,我的程序正在运行,但我遇到了一个问题,因为当我选择多个文件并将其放在textbox上时,源目录无法读取textbox上的内容

这是我的密码

打开文件

btnSearchFile.addSelectionListener(new SelectionAdapter() {
    public void widgetSelected(SelectionEvent e) {
        FileDialog fd = new FileDialog(shell, SWT.MULTI);
        Collection files = new ArrayList();
        String firstFile = fd.open();
        if (firstFile != null) {
            String[] selectedFiles = fd.getFileNames();
            File file = new File(firstFile);
            for (int ii = 0; ii < selectedFiles.length; ii++ )
            {
                if (file.isFile())
                {
                    displayFiles(new String[] { file.toString()});
                }
                else
                    displayFiles(file.list());
            }
        }
    }
});

在文本框中显示文件

public void displayFiles(String[] files) {
    for (int i = 0; files != null && i < files.length; i++) {
        txtSource.append(files[i]);
        txtSource.setEditable(false);
    }
}

复制文件

public static void copyFile(File src, File dest) throws IOException
{
    InputStream oInStream = new FileInputStream(src);
    OutputStream oOutStream = new FileOutputStream(dest);

    // Transfer bytes from in to out
    byte[] oBytes = new byte[1024];
    int nLength;
    BufferedInputStream oBuffInputStream = new BufferedInputStream( oInStream );
    while ((nLength = oBuffInputStream.read(oBytes)) > 0)
    {
        oOutStream.write(oBytes, 0, nLength);
    }
    oInStream.close();
    oOutStream.close();
}

PS:一个文件是可以的,但如果选择了多个文件并放在文本框中,则无法找到源目录


共 (1) 个答案

  1. # 1 楼答案

    为了完全有帮助,我们可以使用一些更详细的信息(特定的异常、完整的MCVE,使用哪些SWT小部件等等)

    也就是说,我认为您已经提供了足够的信息,可以看到您的代码存在一些问题:

    1. 首先,当您选择了多个文件时,会反复显示相同的文件名(第一个文件的名称)。也许这是故意的,但值得一提:

      String[] selectedFiles = fd.getFileNames();
      File file = new File(firstFile);
      for (int ii = 0; ii < selectedFiles.length; ii++ )
      {
          // You've used a FileDialog, so this should always be true
          if (file.isFile())
          {
              // Will always be the first file
              displayFiles(new String[] { file.toString()});
          }
          else
              displayFiles(file.list());
      }
      
    2. 基于上下文,我假设txtSource是一个Text小部件。考虑到这一点,如果我们看看你的displayFiles()方法,你有以下几点:

      txtSource.append(files[i]);
      

      当你反复调用displayFiles()时,你会在所有其他文件名之后加上一个文件名,有效地构建一个长的String,它是所有文件名的组合。在复制列出的文件时,将String拆分回有效的文件路径将非常棘手

      我猜当你说:

      "the source directory can't be found"

      。。。你只是在抓取txtSource的内容。比如:

      new File(txtSource.getText());
      

      "...One file is okay..."

      如果Text对象中只有一个文件名,这肯定会起作用,但如果有多个文件名,则会导致不存在File

      例如,如果选择了两个文件:

      • C:\Users\me\FileA
      • C:\Users\me\FileB

      你的txtSource将显示C:\Users\me\FileAC:\Users\me\FileB。路径C:\Users\me\FileAC:\Users\me\FileB很可能不存在

      在这种情况下,new File(txtSource.getText()).exists()将返回false,并且在FileInputStream的构造函数中使用该File(在copyFile()内)将导致FileNotFoundException


    简而言之,只要确保在调用copyFile()并创建源File对象时,您给出的是您认为自己是的路径,而不是所有选定文件的串联