我如何找到仅给出文件名称的文件路径?
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 的配置,这样如果将来发生变化,你就不需要重新编译了。
我目前正在通过 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 的配置,这样如果将来发生变化,你就不需要重新编译了。