由于某种原因,Android在文件名前放了一个“/”,这是一个问题,因为那时我因为以下错误而无法访问该文件:
该文件位于/data/data/tk.yteditors.london2013/files /
如何解决此问题并阻止File类在我的文件前面添加“/”?
如果您需要更多详细信息,请询问。
01-23 16:59:15.174: W/System.err(26732): java.io.FileNotFoundException: /1043005842.html: open failed: ENOENT (No such file or directory)
01-23 16:59:15.204: W/System.err(26732): at libcore.io.IoBridge.open(IoBridge.java:416)
01-23 16:59:15.204: W/System.err(26732): at java.io.FileInputStream.<init>(FileInputStream.java:78)
01-23 16:59:15.214: W/System.err(26732): at java.io.FileInputStream.<init>(FileInputStream.java:105)
01-23 16:59:15.214: W/System.err(26732): at tk.yteditors.london2013.lib.ftp.SimpleFTP.stor(SimpleFTP.java:151)
01-23 16:59:15.214: W/System.err(26732): at tk.yteditors.london2013.ConfirmActivity.sendFtp(ConfirmActivity.java:109)
01-23 16:59:15.214: W/System.err(26732): at tk.yteditors.london2013.ConfirmActivity$1.run(ConfirmActivity.java:92)
01-23 16:59:15.214: W/System.err(26732): at java.lang.Thread.run(Thread.java:856)
01-23 16:59:15.224: W/System.err(26732): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
01-23 16:59:15.224: W/System.err(26732): at libcore.io.Posix.open(Native Method)
01-23 16:59:15.224: W/System.err(26732): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
01-23 16:59:15.224: W/System.err(26732): at libcore.io.IoBridge.open(IoBridge.java:400)
01-23 16:59:15.224: W/System.err(26732): ... 6 more
激活码:
public void sendFtp() throws Exception{
SimpleFTP ftp = new SimpleFTP();
ftp.connect("<SECRET_IP>", 21, "<SECRET_UN>", "<SECRET_PASS>");
ftp.bin();
ftp.stor(new File(getIntent().getExtras().getString("fileName")));
ftp.disconnect();
}
其他代码:
package tk.yteditors.london2013.lib.ftp;
import java.io.*;
import java.net.*;
import java.util.*;
/**
* SimpleFTP is a simple package that implements a Java FTP client.
* With SimpleFTP, you can connect to an FTP server and upload multiple files.
* <p>
* Copyright Paul Mutton,
* <a href="http://www.jibble.org/">http://www.jibble.org/</a>
*
*/
public class SimpleFTP {
/**
* Create an instance of SimpleFTP.
*/
public SimpleFTP() {
}
/**
* Connects to the default port of an FTP server and logs in as
* anonymous/anonymous.
*/
public synchronized void connect(String host) throws IOException {
connect(host, 21);
}
/**
* Connects to an FTP server and logs in as anonymous/anonymous.
*/
public synchronized void connect(String host, int port) throws IOException {
connect(host, port, "anonymous", "anonymous");
}
/**
* Connects to an FTP server and logs in with the supplied username
* and password.
*/
public synchronized void connect(String host, int port, String user, String pass) throws IOException {
if (socket != null) {
throw new IOException("SimpleFTP is already connected. Disconnect first.");
}
socket = new Socket(host, port);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String response = readLine();
if (response.startsWith("220")) {
} else{
throw new IOException("SimpleFTP received an unknown response when connecting to the FTP server: " + response);
}
sendLine("USER " + user);
response = readLine();
if (!response.startsWith("331") && !response.startsWith("220")) {
throw new IOException("SimpleFTP received an unknown response after sending the user: " + response);
}
sendLine("PASS " + pass);
response = readLine();
if (!response.startsWith("230") && !response.startsWith("220")) {
throw new IOException("SimpleFTP was unable to log in with the supplied password: " + response);
}
// Now logged in.
}
/**
* Disconnects from the FTP server.
*/
public synchronized void disconnect() throws IOException {
try {
sendLine("QUIT");
}
finally {
socket = null;
}
}
/**
* Returns the working directory of the FTP server it is connected to.
*/
public synchronized String pwd() throws IOException {
sendLine("PWD");
String dir = null;
String response = readLine();
if (response.startsWith("257")) {
int firstQuote = response.indexOf('\"');
int secondQuote = response.indexOf('\"', firstQuote + 1);
if (secondQuote > 0) {
dir = response.substring(firstQuote + 1, secondQuote);
}
}
return dir;
}
/**
* Changes the working directory (like cd). Returns true if successful.
*/
public synchronized boolean cwd(String dir) throws IOException {
sendLine("CWD " + dir);
String response = readLine();
return (response.startsWith("250"));
}
/**
* Sends a file to be stored on the FTP server.
* Returns true if the file transfer was successful.
* The file is sent in passive mode to avoid NAT or firewall problems
* at the client end.
*/
public synchronized boolean stor(File file) throws IOException {
if (file.isDirectory()) {
throw new IOException("SimpleFTP cannot upload a directory.");
}
String filename = file.getName();
return stor(new FileInputStream(file.getName()), filename);
}
/**
* Sends a file to be stored on the FTP server.
* Returns true if the file transfer was successful.
* The file is sent in passive mode to avoid NAT or firewall problems
* at the client end.
*/
public synchronized boolean stor(InputStream inputStream, String filename) throws IOException {
BufferedInputStream input = new BufferedInputStream(inputStream);
sendLine("PASV");
String response = readLine();
if (!response.startsWith("227")) {
throw new IOException("SimpleFTP could not request passive mode: " + response);
}
String ip = null;
int port = -1;
int opening = response.indexOf('(');
int closing = response.indexOf(')', opening + 1);
if (closing > 0) {
String dataLink = response.substring(opening + 1, closing);
StringTokenizer tokenizer = new StringTokenizer(dataLink, ",");
try {
ip = tokenizer.nextToken() + "." + tokenizer.nextToken() + "." + tokenizer.nextToken() + "." + tokenizer.nextToken();
port = Integer.parseInt(tokenizer.nextToken()) * 256 + Integer.parseInt(tokenizer.nextToken());
}
catch (Exception e) {
throw new IOException("SimpleFTP received bad data link information: " + response);
}
}
sendLine("STOR " + filename);
Socket dataSocket = new Socket(ip, port);
response = readLine();
if (!response.startsWith("150")) {
throw new IOException("SimpleFTP was not allowed to send the file: " + response);
}
BufferedOutputStream output = new BufferedOutputStream(dataSocket.getOutputStream());
byte[] buffer = new byte[4096];
int bytesRead = 0;
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
output.flush();
output.close();
input.close();
response = readLine();
return response.startsWith("226");
}
/**
* Enter binary mode for sending binary files.
*/
public synchronized boolean bin() throws IOException {
sendLine("TYPE I");
String response = readLine();
return (response.startsWith("200"));
}
/**
* Enter ASCII mode for sending text files. This is usually the default
* mode. Make sure you use binary mode if you are sending images or
* other binary data, as ASCII mode is likely to corrupt them.
*/
public synchronized boolean ascii() throws IOException {
sendLine("TYPE A");
String response = readLine();
return (response.startsWith("200"));
}
/**
* Sends a raw command to the FTP server.
*/
private void sendLine(String line) throws IOException {
if (socket == null) {
throw new IOException("SimpleFTP is not connected.");
}
try {
writer.write(line + "\r\n");
writer.flush();
if (DEBUG) {
System.out.println("> " + line);
}
}
catch (IOException e) {
socket = null;
throw e;
}
}
private String readLine() throws IOException {
String line = reader.readLine();
if (DEBUG) {
System.out.println("< " + line);
}
return line;
}
private Socket socket = null;
private BufferedReader reader = null;
private BufferedWriter writer = null;
private static boolean DEBUG = false;
}
无论我做什么,如果我给它完整路径,它会删除所有路径分隔符,只显示最后一个文件夹名称,WITH SLASH IN FRONT 如果我只是给它一个文件,它就会把它放在前面
PS。你可以看到我很沮丧......
答案 0 :(得分:0)
应该可以只编辑文件位置字符串以考虑添加的'/'(您可能也需要使用'../')。
请注意,如果没有看到您的代码,我就无法确认这是否有效。
编辑:查看代码,编辑变量文件名,删除第一个'/'字符应该可以让你更正添加的'/'。