gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:08:24 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com