0

ファイルを 2 つの異なるディレクトリにアップロードしようとしています。しかし、どういうわけか、ファイルを1つのディレクトリにコピーしますが、2番目のディレクトリにコピーできません。

ファイルの src ディレクトリは次のようなものです

C:\path\to\temp

そして、私の宛先ディレクトリはこのようなものです

C:\path\to\destination\1 & C:\path\to\destination\2

ディレクトリ 1 と 2 はその場で作成されます。

これは私が自分のコードで使用しているものです

public final static boolean move(String src, String dest, boolean createDestDir, boolean overwrite) {
   try{
       if(src == null || src.length() == 0 || dest == null || dest.length() == 0){ 
           return false;
       }
       File srcFile = new File(src);
       if(srcFile.isFile() == false){
          return false;
       }

       String destPath = path(dest);
        String destFileName;
        if (destPath.equals(dest)) {
            destFileName = srcFile.getName();
        } else {
            destFileName = name(dest);
        }
        File destDir = new File(destPath);
        if (destDir.exists() == false) {
            if (createDestDir == false) return false;
            if (destDir.mkdirs() == false) {
                return false;
            }
        }
        File destFile = new File(destPath + destFileName);
        if (destFile.exists()) {
            if (overwrite == false) return false;
            if (destFile.delete() == false) {
                return false;
            }
        }
        return srcFile.renameTo(destFile);
   }

}

ループsrcFile.isFile()が 2 回目に失敗している間、1 回目は機能しますが、2 回目は失敗します。

4

1 に答える 1

1

このmkdirsメソッドは、ファイルパスに存在しない親ディレクトリを作成します。例えば。宛先の場所が C:\some\path\to\file\ の場合、 を呼び出すとmkdirs、C:\some が存在するかどうかがチェックされ、次に C:\some\path が存在するかどうかがチェックされます。パスが存在しない場合は、そのフォルダーを作成して続行します。完了すると、フォルダーを作成する必要がある場合にのみtrue が返されます。ディレクトリ構造が存在する場合は false を返します。

あなたのコードでは、これがあります:

File destDir = new File(destPath);
if (destDir.exists() == false) {
    if (createDestDir == false) return false;
    if (destDir.mkdirs() == false) {
        return false;
    }
}
File destFile = new File(destPath + destFileName);
if (destFile.exists()) {
    if (overwrite == false) return false;
    if (destFile.delete() == false) {
       return false;
    }
}

なぜこのような複雑な方法でディレクトリ構造を作成するのか、私にはわかりません。createDestDir変数全体の代わりに(それfalseが true になるはずだと私は思います)、mkdirs()メソッドを呼び出すだけです。ディレクトリ構造がすでに整っている場合、そのメソッドを呼び出すのは難しいことではありません。

次に、次のコードで、ファイルがファイル システムに既に存在するかどうかを確認します。ファイルが存在し、overwriteブール値をに設定していない場合はtrue、ファイルを削除しようとします。しかし、あなたは決して電話しませんcreateNewFile()。ファイル システム上に実際にファイルを作成することはありません。

上記のコードを次のコードに置き換えてみてください。

new File(destPath).mkdirs();
File destFile = new File(destPath + destFileName);
if (destFile.exists()) 
    if (!overwrite) {
        return false;
    } else {
        destFile.delete();
    }
}
destFile.createNewFile();

これにより、必要に応じて宛先ディレクトリが作成され、ファイルの存在が確認され (許可され、必要な場合は削除され)、その場所にファイルが作成されます。

destPathまた、ファイル区切り記号で終わっていることを確認する必要があります。Linux/Unix では "/"、Windows では "\" -- そうしdestPath + destFileNameないと、おかしなことが起こります。

于 2012-08-13T16:07:56.557 に答える