2

私のAndroidアプリケーションでは、file.exists機能に問題があります。以下は、2 つの変数を取得する関数です。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 が返されますが、このパスのファイルが存在します。私が間違っていることは何ですか?

4

2 に答える 2

4

問題は、作成方法にありますFile source

間違ったディレクトリでファイルを生成するバグがあります。

したがって、間違ったファイルパスを参照しているため、呼び出すときは.exists単純にそうではありません

public String 部分文字列 (int start、int end)

導入されたバージョン: API レベル 1 この文字列の文字のサブシーケンスを含む文字列を返します。返された文字列は、この文字列のバッキング配列を共有します。

パラメータは、最初の文字のオフセットを開始します。最後の文字の 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.
于 2012-09-20T16:17:42.857 に答える
0

これまでのところ実際の間違いを見つけることはできません。ファイルシステム、fileOutputStream、またはFileChannel#closeでのコード同期が、ファイルシステムが一部のデータをキャッシュするため、必要な速度で実行されない可能性があることを確認してください。

ご覧ください:http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FileDescriptor.html

ほとんどの場合、少量のデータをコピーすると、このような問題が発生します。

于 2012-09-20T16:21:23.767 に答える