java - 如何在 Java 中检索正在运行的进程的工作目录?

标签 java process

原始帖子大多数人都在回复的帖子

Here is the code I have already tried doing this with

String workingDirectory = "/home";
String command = "cd ../";

ProcessBuilder pb = new ProcessBuilder(new String[] { "cmd", "/c", command });
pb.directory(new File(workingDirectory));
pb.redirectErrorStream(true);
Process process = pb.start();

// Some time later once the process has been closed
workingDirectory = pb.directory().getAbsolutePath();
System.out.println("Path: " + workingDirectory);

This does not work, once it finishes it comes out with the same working directory.

Any help would be greatly appreciated, this would be a very useful think to know.

To be more specific, I am looking to find the working directory of a dynamically created process in Java, such as in the snippet above. This is important because such as the predefined command above, working directories can change sometimes, I would like to save any changes into memory for later use.

我找到了一种方法,而且似乎没有问题

这是我处理传入工作目录的方式

public int osType = 1; // This is for Windows (0 is for Linux)

public boolean isValidPath(String path) {
    try {
        Paths.get(new File(path).getAbsolutePath());
    } catch (InvalidPathException | NullPointerException ex) {
        return false;
    }
    return true;
}

public String tracePath(String path) {
    try {
        if (!path.contains("%%") && !isValidPath(path)) return null;
        if (path.contains("%%")) path = path.substring(path.indexOf("%%"));
        int lastIndex = -1;
        char filesystemSlash = ' ';
        if (osType == 0)
            filesystemSlash = '/';
        if (osType == 1)
            filesystemSlash = '\\';
        if (osType == 0)
            path = path.substring(path.indexOf(filesystemSlash));
        if (osType == 1)
            path = path.substring(path.indexOf(filesystemSlash) - 2);
        String tmp = path;
        boolean broken = true;
        while (!isValidPath(tmp)) {
            int index = tmp.lastIndexOf(filesystemSlash);
            if (lastIndex == index) {
                broken = false;
                break;
            }
            tmp = tmp.substring(0, index);
            lastIndex = index;
        }
        if (broken && lastIndex != -1) {
            tmp = path.substring(0, lastIndex);
        }
        return tmp;
    } catch (StringIndexOutOfBoundsException ex) {
        return null;
    }
}

这是忽略路径问题的方法(不使用它)

public boolean setDirectory(ProcessBuilder pb, String path) {
    try {
        pb.directory(new File(new File(path).getAbsolutePath()));
        return true;
    } catch (Exception ex) {
        return false;
    }
}

下面是我如何启动 Windows 或 Linux 的过程

File file = null;
        if (osType == 1) {
            ProcessBuilder pb = new ProcessBuilder(new String[] { "cmd", "/c", command + " & echo %% & cd" });
            pb.redirectErrorStream(true);
            if (!workingDirectory.equals(""))
                setDirectory(pb, workingDirectory);
            process = pb.start();
        } else if (osType == 0) {
            file = new File("script.sh");
            FileWriter writer = new FileWriter(file, false);
            writer.append(command + " && echo %% && pwd");
            writer.flush();
            writer.close();
            ProcessBuilder pb = new ProcessBuilder(new String[] { "bash", System.getProperty("user.dir") + "/script.sh" });
            pb.redirectErrorStream(true);
            if (!workingDirectory.equals(""))
                setDirectory(pb, workingDirectory);
            process = pb.start();
        } else
            return;

最后是管理进程和工作目录的循环

while (process.isAlive() || process.getInputStream().available() > 0) {
            byte[] returnBytes = new byte[1024];
            process.getInputStream().read(returnBytes);
            char[] arr = new String(returnBytes).trim().toCharArray();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < arr.length; i++) {
                char c = arr[i];
                if (Character.isDefined(c))
                    sb.append(c);
            }
            String response = sb.toString();
            if (!response.equals("")) {
                String path = tracePath(response.trim().replace("\n", "").replace("\r", ""));
                if (path != null && osType == 1) {
                    if (Paths.get(path).toFile().exists())
                        workingDirectory = path;
                } else if (path != null && osType == 0) {
                    if (Paths.get(path).toFile().exists())
                        workingDirectory = path;
                }
                client.sendMessage(response + '\r' + '\n');
            }
        }
if (file != null) file.delete();

这是命令接收网站的输出

Connecting..
Connected.
Success. You have been connected -> Speentie

bash -c pwd
/root/hardsceneServer/remoteServer

%%
/root/hardsceneServer/remoteServer

bash -c cd ..

%%
/root/hardsceneServer

bash -c pwd
/root/hardsceneServer

%%
/root/hardsceneServer

bash -c dir
ircServer  nohup.out  remoteServer  start.sh  start1.sh  start2.sh

%%
/root/hardsceneServer

bash -c cd ircServer

%%
/root/hardsceneServer/ircServer

bash -c dir
HardScene.jar         hardscene_banned.properties  start.sh
hardscene.properties  nohup.out

%%
/root/hardsceneServer/ircServer

最佳答案

你在找这样的东西吗?

System.out.println("Current working directory: " + System.getProperty("user.dir"));
System.out.println("Changing working directory...");
// changing the current working directory
System.setProperty("user.dir", System.getProperty("user.dir") + "/test/");

// print the new working directory path
System.out.println("Current working directory: " + System.getProperty("user.dir"));

// create a new file in the current working directory
File file = new File(System.getProperty("user.dir"), "test.txt");

if (file.createNewFile()) {
    System.out.println("File is created at " + file.getCanonicalPath());
} else {
    System.out.println("File already exists.");
}

输出:

Current working directory: /Users/Wasi/NetBeansProjects/TestProject
Changing working directory...
Current working directory: /Users/Wasi/NetBeansProjects/TestProject/test/
File is created at /Users/Wasi/NetBeansProjects/TestProject/test/test.txt

关于java - 如何在 Java 中检索正在运行的进程的工作目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42598547/

相关文章:

java - Struts 2 类型转换器问题

java - 如何从java启动cmd.exe?

c - 为什么 "kill -15"有时会失败?

java - 如何在 JPA 域模型中实现状态设计模式

python - 在 uwsgi 应用程序中运行子进程

node.js - 通过 Grunt 运行 Node 应用程序

等待输入的 Java ProcessBuilder 进程

java - tomcat端口问题无法启动tomcat

java - 在 Java 中获取 XML 元素中的值

java - Android 联系人权限无需在运行时询问即可授予