android file.exists无法正常工作

时间:2012-09-20 15:54:48

标签: java android file exists

在我的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但我的文件存在此路径。我做错了什么?

2 个答案:

答案 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

当我主要复制少量数据时,我遇到了这样的问题。