使用 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 小部件等)。
也就是说,我认为您提供的内容足以看出您的代码存在一些问题:
对于初学者来说,当您选择了多个文件时,您会一遍又一遍地显示相同的文件名(第一个文件的名称)。也许这是故意的,但值得一提:
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());
}
根据上下文,我假设 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
对象时,您所提供的路径就是您认为的路径,而不是串联选择的所有文件。
我正在使用一个传输文件程序并且我的程序正在运行,但我遇到了一个问题,因为当我 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 小部件等)。
也就是说,我认为您提供的内容足以看出您的代码存在一些问题:
对于初学者来说,当您选择了多个文件时,您会一遍又一遍地显示相同的文件名(第一个文件的名称)。也许这是故意的,但值得一提:
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()); }
根据上下文,我假设
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()
将 returnfalse
,并在FileInputStream
的构造函数中使用File
(在copyFile()
) 会导致FileNotFoundException
.
简而言之,只要确保当您调用 copyFile()
并创建源 File
对象时,您所提供的路径就是您认为的路径,而不是串联选择的所有文件。