使用 SWT 文件对话框复制多个文件

Copying Multiple files using SWT filedialog

我正在使用一个传输文件程序并且我的程序正在运行,但我遇到了一个问题,因为当我 select 多个文件并将其放在 textbox 源目录中时'不要阅读 textbox

上的内容

这是我的代码

开幕式file/files

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: 一个文件可以,但是如果select编辑多个文件并放在文本框中,则找不到源目录

为了完全有帮助,我们确实可以使用更多细节(特定异常、完整的 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() 将 return false,并在 FileInputStream 的构造函数中使用 File(在 copyFile() ) 会导致 FileNotFoundException.


简而言之,只要确保当您调用 copyFile() 并创建源 File 对象时,您所提供的路径就是您认为的路径,而不是串联选择的所有文件。