【问题标题】:How can i convert a FilePath to a File?如何将 FilePath 转换为文件?
【发布时间】:2013-11-15 18:07:23
【问题描述】:

我正在编写一个 Jenkins 插件,我正在使用 build.getWorkspace() 来获取当前工作区的路径。问题是这会返回一个 FilePath 对象。

如何将其转换为 File 对象?

【问题讨论】:

  • @Downvoter 我不明白为什么有些人只是 -1 而没有说明原因。我认为我们应该告诉男孩/女孩发布一些代码,询问他们到目前为止已经尝试过什么,等等。只需提供一些反馈,我们就可以从这次经历中学到一些东西。
  • 问题:你为什么想要一个File 对象? FilePath 实际上是一个非常有表现力的 API,专门用于处理远程文件操作。如果您尝试在远程从属代理上使用File 访问工作区,那么您“会过得很糟糕”。

标签: jenkins hudson jenkins-plugins hudson-plugins


【解决方案1】:

虽然我没有尝试过,但是根据javadoc你可以获取URI,然后你可以从中创建一个文件:File myFile = new File(build.getWorkspace().toURI())

【讨论】:

  • 如果您需要将路径作为字符串,请改用build.workspace.getRemote()
  • 感谢您对我的回答提出非常建设性的挑战!愿投票与你同在 ;-)
【解决方案2】:

如果您的插件适用于 master 和 slave,请使用 act 函数并调用您自己的 FileCallable 实现。如需更多信息,请查看documentation, chapter "Using FilePath smartly" 或此stackoverflow answer

代码示例(source):

void someMethod(FilePath file) {
    // make 'file' a fresh empty directory.
    file.act(new Freshen());
}
// if 'file' is on a different node, this FileCallable will
// be transferred to that node and executed there.
private static final class Freshen implements FileCallable<Void> {
    private static final long serialVersionUID = 1;
    @Override public Void invoke(File f, VirtualChannel channel) {
        // f and file represent the same thing
        f.deleteContents();
        f.mkdirs();
        return null;
    }
}

【讨论】:

    【解决方案3】:

    这种方法 File myFile = new File(build.getWorkspace().toURI()) 不是正确的解决方案。我不知道为什么到目前为止这一直是公认的答案。 Sascha Vetter 提到的方法是正确的,参考 Jenkins 官方javadocs

    ,上面写的很清楚,我引用了

    与 File 总是暗示当前计算机上的文件路径不同,FilePath 代表特定代理或控制器上的文件路径。

    因此,作为 Jenkins 社区的积极贡献者,我会参考 Sascha Vetter 给出的答案。

    PS。声誉点标准使我无法对正确答案进行投票。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多