【问题标题】:Java can't access file on local pathJava 无法访问本地路径上的文件
【发布时间】:2021-12-01 08:47:52
【问题描述】:

问了这个问题,已经在堆栈上的其他问题中尝试过可能的解决方案,但这并没有让我解决问题。

如标题所示,我创建了一个 java 实用程序,我必须使用它对文本文件执行操作,特别是我必须执行简单的操作以在目录之间移动、从一个目录复制到另一个目录等。

为此,我使用了 java 库 java.io.Filejava.nio.*,并且我现在已经实现了两个函数,copyFile(sourcePath, targetPath)moveFile(sourcePath, targetPath)。 为了开发这个我使用的是mac,文件在源路径/Users/myname/Documents/myfolder/F24/archive/下,我的目标路径是/Users/myname/Documents/myfolder/F24/target/

但是当我运行我的代码时,我得到一个java.nio.file.NoSuchFileException: /Users/myname/Documents/myfolder/F24/archive

已经尝试过堆栈和 java 文档中的其他解决方案,但我还不能解决这个问题......我接受任何建议或建议

谢谢大家

  • 我的代码:
// copyFile: funzione chiamata per copiare file
    public static boolean copyFile(String sourcePath, String targetPath){

        boolean fileCopied = true;
        
        try{

            Files.copy(Paths.get(sourcePath), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING);

        }catch(Exception e){
            String sp = Paths.get(sourcePath)+"/";
            fileCopied = false;
            System.out.println("Non posso copiare i file dalla cartella "+sp+" nella cartella "+Paths.get(targetPath)+" ! \n");
            e.printStackTrace();
        }


        return fileCopied;
    }

【问题讨论】:

  • 先试试chmod -R 777 /Users/myname/Documents/myfolder/F24/archive/
  • 您是否要移动或复制目录,包括其内容?如果是,请检查this question
  • 有时监督:targetPath 不能是目录,而是(可能还不存在的)目标文件的完整路径 - 带有文件名。复制选项也很投标。
  • 嗨,作为第一个操作,我给了文件夹 777 权限,但它一直给我例外......让我感到困惑的是,我拥有文件的路径是 /Users/myname/Documents/myfolder/F24/archive/ but the异常将我显示为路径`/Users/myname/Documents/myfolder/F24/archive`,即最后一个/ 丢失了......我不知道这是否可能
  • @deHaar 不,我只想复制文件而不是目录

标签: java exception java.nio.file


【解决方案1】:

Files.copy 无法复制整个目录。您传递给Files.copy 的第一个“路径”必须全部:

  • 存在。
  • 可由运行 JVM 的进程读取。这在 Mac 上是不平凡的,默认情况下它几乎拒绝所有应用程序的所有磁盘权限,直到您授予它访问权限。这对于 Java 应用程序来说可能很棘手。我不太确定你是如何解决它的(我在我的 Mac 上做了一些事情来摆脱它,但我不记得是什么 - 可能开箱即用的 Java 应用程序只是可以阅读他们想要的任何内容,而这只是实际的 Mac被伪沙盒化的应用程序。关键是,即使这个东西的 unix 文件权限表明你应该能够读取它,也有可能是 mac 的应用程序访问控制拒绝它)。
  • 是一个普通的旧文件,而不是目录或诸如此类的东西。

Files.move 可以(通常 - 取决于 impl 和底层操作系统)通常用于目录,但不能用于Files.copy。您使用的是编程语言,而不是 shell。如果要复制整个目录,请编写执行此操作的代码。

【讨论】:

    【解决方案2】:

    不确定我的评论是否得到理解。

    Ìn java SE target 不能是目标目录。在文件复制的其他API中 可以说COPY FILE TO DIRECTORY。在java中不是这样;这是为了消除一个错误原因而有意设计的。

    那种风格是:

            Path source = Paths.get(sourcePath);
            if (Files.isRegularFile(source)) {
                Path target = Paths.get(targetPath);
                Files.createDirectories(target);
                if (Files.isDirectory(target)) {
                    target = Paths.get(targetPath, source.getFileName().toString()); 
                    // Or: target = target.resolve(source.getFileName().toString());
                }
                Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
            }
    

    更好地确保调用时使用完整路径。

    【讨论】:

    • 嗨乔普,我已经像你的代码一样编辑了我的copyFile,但问题仍然存在,我收到以下错误:我无法将文件从文件夹/Users/myname/Documents/myfolder/F24/archive 复制到文件夹@987654326 @
    • 我已经添加了代码。但该错误似乎表明您将文件复制到自身。这是不可能的,因为当打开一个文件进行读取时,您不再可以写入它(即使用替换进行复制)。其他已经提到的目录也是使用Files.walk复制的
    猜你喜欢
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多