【问题标题】:file.getParentFile().mkdirs(); creates duplicate folders in osxfile.getParentFile().mkdirs();在 osx 中创建重复的文件夹
【发布时间】:2013-01-19 21:02:20
【问题描述】:

我目前正在开发一个旨在在 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”

【问题讨论】:

    标签: java macos file exception directory


    【解决方案1】:

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

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

    一旦您弄清楚名称的不同之处,就应该很清楚如何解决该问题。

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

    【讨论】:

    • +1,但也请注意它可能非常棘手(例如零宽度非连接器,我不知道名称中的结果如何,但它可以:P)
    • @Doorknob: ls -B 会将其打印为转义序列。
    • 相信我,这就是我的想法,但它们完全相同,我知道这在 Windows 上是不可能的,我不确定,但我认为在 osx 上也不可能,但这就是为什么我如此卡住了,此外,目标文件名来自 JFileChooser,我相信它应该返回确切选择的文件名
    • @MateoArdilaVillegas:请在您的问题中包含来自ls -Bls -1 | od -c 的输出。
    • @NPE 它看起来像是一种语言问题, ls -B 返回:“Documents”和“Documentos”,即使它们在查找器中都显示为“Documentos”
    【解决方案2】:

    如果您使用的是 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.getMessage()),而是使用println(ex)。当然,ex.printStackTrace() 比其中任何一个都更有用。

    【讨论】:

    • 谢谢,但我得到与您提供的代码相同的结果,它可以工作,但给我留下了重复的文件夹
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 2014-10-09
    • 2013-04-29
    • 2013-07-21
    • 2018-12-10
    • 1970-01-01
    • 2022-08-23
    相关资源
    最近更新 更多