在我的Android应用程序中,我遇到了file.exists
函数的问题。下面是我的函数,它获取两个变量。 from
是文件的完整路径,to
是我必须复制文件的目录路径。例如
from == "/mnt/sdcard/Media/Image/Abstact wallpapers/abstraction-360x640-0033.jpg";
和
to == "/mnt/sdcard";
public static boolean copyFile(String from, String to) {
File sd = Environment.getExternalStorageDirectory();
if (sd.canWrite()) {
int end = from.toString().lastIndexOf("/") - 1;
String str1 = from.toString().substring(0, end);
String str2 = from.toString().substring(end+2, from.length());
File source = new File(str1, str2);
File destination= new File(to, str2);
if (source.exists()) {
FileChannel src = new FileInputStream(source).getChannel();
FileChannel dst = new FileOutputStream(destination).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
}
}
return true;
} catch (Exception e) {
return false;
}
}
当我调试它时,if (source.exists())
返回false但我的文件存在此路径。我做错了什么?
答案 0 :(得分:4)
问题在于您创建File
source
的方式。
它中存在一个错误,它生成一个包含错误目录的文件。
所以当你打电话给.exists
时,根本就没有,因为你指的是错误的文件路径
public String substring(int start,int end)
自:API级别1 返回包含此字符串中字符子序列的字符串。返回的字符串共享此字符串的后备数组。
参数 开始第一个字符的偏移量。 结束最后一个字符后的偏移量。 返回 包含从头到尾的字符的新字符串 - 1
您误用了substring
。它从头到尾获得子串-1。你自己有-1,所以事实上你实际上已经从文件夹目录中将它变为-2。
如果删除额外的-1并将下一个子串的开始减少1,它应该可以工作。
int end = from.toString().lastIndexOf("/") ;
String str1 = from.toString().substring(0, end);
String str2 = from.toString().substring(end+1, from.length());
修改强>
改进的方法是使用File
方法
File source = new File(from); //creates file from full path name
String fileName = source.getName(); // get file name
File destination= new File(to, fileName ); // create destination file with name and dir.
答案 1 :(得分:0)
到目前为止看不到任何真正的错误,请确保您在文件系统上的代码同步,fileOutputStream或FileChannel #close可能无法在文件系统缓存某些数据时做得足够快。
查看:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html
当我主要复制少量数据时,我遇到了这样的问题。