gpt4 book ai didi

java - 如何确定一个目录是在文件系统层次结构中的另一个目录之下还是之上

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

我目前正在做一个类似于 FTP 的实现的项目。为此,我需要实现虚拟 chrooting,它应该也适用于 Windows 平台。

我目前的做法是,每个用户都有一个特定的主目录(由 File 对象表示),每次用户尝试访问文件或目录时,服务器都会检查该文件是否存在或目录是否在此主目录内。

遗憾的是,我不确定如何以不占用太多 CPU 时间和 HDD 访问时间的方式执行此检查。人们可以简单地尝试遍历目录,如果我们到达一个等于给定主目录的目录,我们就会感到满意。如果我们到达根目录,我们返回 false,因为给定的文件很可能不在主目录中。

我确信这个检查会起作用,但我也认为这会非常昂贵,并且在多用户环境中可能非常低效。

如果能帮助我更好地设计此算法,我将不胜感激。也许甚至存在一种方法?不过我还没有找到。

提前致谢!

//编辑:根据要求,这里是这个文件结构的一些例子

- /
- home/
- user1/
- file1.txt
- file2.txt
- user2/
- picture.png
- someDir/

我们假设有 2 个用户(“user1”和“user2”),用户 1 的主目录为“/home/user1”,用户 2 的主目录为“/home/user2”。
如果应用于此场景,我正在寻找的方法应该会给出以下结果:

isInsideHome("/home/user2/picture.png", "user1") -> false
isInsideHome("/home/user1/file1.txt", "user1") -> true
isInsideHome("/", "user1") -> false
isInsideHome("/home", "user2") -> false

我希望这些例子能阐明我在寻找什么。

最佳答案

假设您没有调用 createNewFile()、exists() 等方法,java.io.File 不需要 HDD 访问,并且只需要最少的 CPU。

例如我的电脑上不存在以下路径,但代码执行无异常

public static void main(String[] args) {
System.out.println(isInsideHome("/home/user2/picture.png", "user1"));
System.out.println(isInsideHome("/home/user1/file1.txt", "user1"));
System.out.println(isInsideHome("/", "user1"));
System.out.println(isInsideHome("/home", "user2"));
}

private static boolean isInsideHome(String pathStr, String leaf) {
File path = new File(pathStr);
File search = new File(leaf);
while ((path = path.getParentFile()) != null) {
if (search.getName().equals(path.getName())) {
return true;
}
}
return false;
}

java.io.File.getParentFile() 的源代码显示不涉及 HDD 访问...

public static void main(String[] args) {
System.out.println(isInsideHome("/home/user2/picture.png", "user1"));
System.out.println(isInsideHome("/home/user1/file1.txt", "user1"));
System.out.println(isInsideHome("/", "user1"));
System.out.println(isInsideHome("/home", "user2"));
}

private static boolean isInsideHome(String pathStr, String leafStr) {
File path = new File(pathStr);
File leaf = new File(leafStr);
while ((path = path.getParentFile()) != null) {
if (leaf.getName().equals(path.getName())) {
return true;
}
}
return false;
}

关于java - 如何确定一个目录是在文件系统层次结构中的另一个目录之下还是之上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28886162/

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