我如何找到仅给出文件名称的文件路径?

How do i find a filepath given only the name of the file?

我目前正在通过 tcp 连接将文件从服务器传输到客户端。该文件存在于服务器的 sharedroot 目录中的某处。这是我的服务器上传到客户端的上传方法的示例代码。

public void upload(String filename, DataOutputStream out) throws IOException {
        File fname = null;
        if (filename.contains(sharedroot)) {   //this is if the client provides a proper filepath with the filename
            fname = new File(filename);
        }else {      //if client only provides a filename without path
            fname = new File(filename);  
//"..\..\"+   //i was working around with this, but somehow just making the file whether or not it contains the sharedroot seems to give me the "best" output so far...
        }
        
        System.out.println(fname.getCanonicalPath());
        
        if (fname.isDirectory()) {
            System.out.println("File is a directory");
            String quit = "404 not found";
            sendOut(quit, out);
            return;
        }
        
        String path = fname.getAbsolutePath();
        System.out.println(path);
        
        
        if (fname.isFile()) {
            String canonpath = fname.getCanonicalPath();
            if (canonpath.contains(sharedroot)) {
                try {
                    FileInputStream in = new FileInputStream(fname);

                    byte[] buffer = new byte[1024];

                    out.writeInt(fname.getName().length());
                    out.write(fname.getName().getBytes(), 0, fname.getName().length()); // writes file name only, not
                                                                                        // including the path

                    long size = fname.length();
                    out.writeLong(size);

                    while (size > 0) {
                        int len = in.read(buffer, 0, buffer.length);
                        out.write(buffer, 0, len);
                        size -= len;
                    }
                } catch (Exception e) {
                    System.out.println("Error occurred in uploading file to client. Please try again");
                }
            }else {
                System.out.println("File not in shared directory");
                String quit = "404 not found";
                sendOut(quit, out);
            }
        }else {
            System.out.println("File not exists");
            String quit = "404 not found";
            sendOut(quit, out);
        }
    }

如下所示,getCanonicalPath() 和 getAbsolutePath() 给出的输出是错误的,因为它检查的是我的 eclipse 目录,而不是 sharedroot 目录。我怎样才能得到文件的文件路径,以便我可以将它与我的 sharedroot 进行比较并确保它存在于 sharedroot 中? sharedroot 例如:D:\seantuniFiles。 FINE2005 第 3 年

D:\seant\eclipse-workspace\DCN3005\Lecture 1 Exercise.pdf

D:\seant\eclipse-workspace\DCN3005\Lecture 1 Exercise.pdf

文件不存在

您创建的文件没有指定专用目录。有两个构造函数需要一个(根)目录和一个文件名——一个是文件本身,另一个是字符串。我假设你的路径之一是相对的,但你的其他分支创建文件的方式与完全限定路径相同。您应该将 sharedRoot 作为第一个参数传递,将 fileName 作为第二个参数传递。

File fname = null;
// sharedRoot is more like a constant and startsWith
// avoids reading somewhere else that looks similar
if (filename.startsWith(sharedRoot)) {   
  fname = new File(filename);
} else {      
  fname = new File(sharedRoot, filename);
}

在所有其他情况下,相对路径是相对于 VM 进程的根目录——我的意思是进程。例如,如果用户在用户的 HOME 目录中启动它,它将相对于此。如果操作系统任务启动 VM,它将相对于 OS 进程的根目录——它可能是一个 Unix cron 作业或一个 Windows 调度程序。

也许你引入了一种 sharedRoot 的配置,这样如果将来发生变化,你就不需要重新编译了。