我目前正在开发一个旨在在windows和osx上工作的程序,我有这个函数来复制一个在windows中完美工作的文件,但是当我在osx中尝试它时,我得到一个IOException: "没有这样的文件或目录",我研究了一点,发现也许目标目录不存在(尽管它确实存在),所以我添加了这些行:
if(!f2.getParentFile().exists())
{
f2.getParentFile().mkdirs();
}
if(!f2.exists())
{
f2.createNewFile();
}
这似乎解决了问题,但是当我寻找复制的文件(位于documents)时,我一开始找不到它,但后来我看到程序实际上创建了一个我想要保存文件的文件夹的副本,所以我最终得到了两个文件夹具有完全相同的"documents"名称,下面是其余的代码:
public static Boolean copyfile(String srFile, String dtFile )
{
{
try
{
File f1 = new File(srFile);
File f2 = new File(dtFile);
if(!f2.getParentFile().exists())
{
f2.getParentFile().mkdirs();
}
if(!f2.exists())
{
f2.createNewFile();
}
InputStream in = new FileInputStream(f1);
OutputStream out = new FileOutputStream(f2);
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0){
out.write(buf, 0, len);
}
in.close();
out.close();
System.out.println("File copied.");
}
catch(FileNotFoundException ex){
System.out.println(ex.getMessage() + " in the specified directory.");
JOptionPane.showMessageDialog(new JFrame(), ex.getMessage());
return true;
}
catch(IOException e){
System.out.println(e.getMessage());
JOptionPane.showMessageDialog(new JFrame(), e.getMessage());
return true;
}
}
return false;
}
这显然不是想要的结果,我该怎么做才能让程序识别我想要保存文件的文件夹?
更新:我使用了ls -B命令,它显示了两个不同语言的文件夹:"Documents"one_answers"documententos",尽管它们在查找器
所以我最终得到了两个文件夹,名称完全相同,
那是不可能发生的。这两个目录的名称(可能非常微妙)不同。例如,可以在名称后面加一个空格,等等。
一旦你弄清楚了名字的不同之处,如何解决这个问题就很清楚了。
您可以使用以下命令来解决此问题:ls -B
应该将任何不可打印的字符显示为xxx
。至于尾随空格等,请尝试ls -1 | od -c
并仔细检查输出
如果您使用的是Java 7,请尝试使用Java .nio.file包。错误,如果有的话,应该提供更多的信息:
Path source = Paths.get(srFile);
Path dest = Paths.get(dtFile);
Files.createDirectories(dest.getParent());
Files.copy(source, dest);
我建议您避免调用Throwable的getMessage()
方法。它通常提供的信息除非显示在异常类旁边,否则没有任何意义。所以,用println(ex)
代替println(ex.getMessage())
。当然,ex.printStackTrace()
比这两种都有用得多。