1

我目前正在开发一个旨在在 windows 和 osx 上运行的程序,我有这个功能来复制一个在 windows 中完美运行的文件,但是当我在 osx 中尝试它时,我得到一个 IOException:“没有这样的文件或目录”,我研究了一点点,发现目标目录可能不存在(虽然它确实存在)所以我添加了这些行:

if(!f2.getParentFile().exists())
{
    f2.getParentFile().mkdirs();
}
if(!f2.exists())
{
   f2.createNewFile();
}

这似乎解决了问题,但是当我查找复制的文件(位于文档中)时,我一开始找不到它,但后来我看到程序实际上创建了一个我想保存文件的重复文件夹进入,所以我最终得到了两个具有完全相同“文档”名称的文件夹,这是其余的代码:

    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”和“Documentos”,即使它们在查找器中都显示为“Documentos”

4

2 回答 2

2

所以我最终得到了两个具有完全相同“文档”名称的文件夹,

那不可能发生。这两个目录具有(可能非常微妙)不同的名称。例如,名称中可能有一个尾随空格等。

一旦弄清楚名称的区别是什么,就应该很清楚如何解决该问题。

您可以使用以下命令来解决此问题: ls -B应该将任何不可打印的字符显示为\xxx. 至于尾随空格等,请尝试ls -1 | od -c仔细检查输出。

于 2013-01-19T21:35:30.803 回答
0

如果您使用的是 Java 7,请尝试使用 java.nio.file 包。错误(如果有)应该提供更多信息:

Path source = Paths.get(srFile);
Path dest = Paths.get(dtFile);
Files.createDirectories(dest.getParent());
Files.copy(source, dest);

我建议你避免调用getMessage()Throwable 的方法。它通常提供没有意义的信息,除非显示在异常类旁边。所以,代替println(ex.getMessage()),使用println(ex)。当然,比其中任何一个都有用得多ex.printStackTrace()

于 2013-01-19T21:16:33.730 回答