1

FileVisitorこれは、 がどのように機能し、ディレクトリを解析するかについての私の知識が限られていることに関係していると思います。私がやろうとしているのは、ディレクトリの内容を別のディレクトリに移動することです。私はこのFileVisitor<Path>ように実装することでこれを行っています:

public class Mover implements FileVisitor<Path> {

    private Path target;
    private Path source;

    public Mover(Path source, Path target) {
        this.target = target;
        this.source = source;
    }

    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
        Path targetDir = target.resolve(source.relativize(dir));
        try {
            Files.move(dir, targetDir);
        } catch (FileAlreadyExistsException e) {
            if(!Files.isDirectory(targetDir)) {
                System.out.println("Throwing e!");
                throw e;                
            }
        }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult postVisitDirectory(Path file, IOException exc) throws IOException {
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
        try {
            Files.move(file, target.resolve(source.relativize(file)));                      
    } catch (NoSuchFileException e) {
                //TODO: Figure out why this exception is raised!
                System.out.println("NoSuchFileException");
            }
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
        return FileVisitResult.CONTINUE;
    }   
}

次に、クラスMoverを次のように使用します。

Files.walkFileTree(from, new Mover(from, to));

fromを呼び出すときに2回追加するのは好きではありませんwalkFileTreeが、現在、私の問題は主にTODOコード内の の下の行にあります(ただし、それを解決する方法についてのコメントをいただければ幸いです)。その例外が発生する理由がわかりません。ファイルが既に移動されているためだと思います。その場合、コードが再び移動しようとするのを止めるにはどうすればよいですか?現在行っている方法は多かれ少なかれ正しいですか?

4

1 に答える 1

-1

以下は、プログラムでファイルを移動する関数です

マニフェストに正しい権限を設定する

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    private void moveFile(String inputPath, String inputFile, String outputPath) {
InputStream in = null;
OutputStream out = null;
try {
    //create output directory if it doesn't exist
    File dir = new File (outputPath); 
    if (!dir.exists())
    {
        dir.mkdirs();
    }
    in = new FileInputStream(inputPath + inputFile);        
    out = new FileOutputStream(outputPath + inputFile);
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
    in.close();
    in = null;
        // write the output file
        out.flush();
    out.close();
    out = null;
    // delete the original file
    new File(inputPath + inputFile).delete(); 
} 
     catch (FileNotFoundException fnfe1) {
    Log.e("tag", fnfe1.getMessage());
}
      catch (Exception e) {
    Log.e("tag", e.getMessage());
  }
}

ファイルを削除するには

     private void deleteFile(String inputPath, String inputFile) {
    try {
    // delete the original file
    new File(inputPath + inputFile).delete();  
   }
  catch (FileNotFoundException fnfe1) {
    Log.e("tag", fnfe1.getMessage());
 }
  catch (Exception e) {
    Log.e("tag", e.getMessage());
 }
}

コピーする

         private void copyFile(String inputPath, String inputFile, String outputPath)         {
InputStream in = null;
OutputStream out = null;
try {
    //create output directory if it doesn't exist
    File dir = new File (outputPath); 
    if (!dir.exists())
    {
        dir.mkdirs();
    }
    in = new FileInputStream(inputPath + inputFile);        
    out = new FileOutputStream(outputPath + inputFile);
    byte[] buffer = new byte[1024];
    int read;
    while ((read = in.read(buffer)) != -1) {
        out.write(buffer, 0, read);
    }
    in.close();
    in = null;
        // write the output file (You have now copied the file)
        out.flush();
    out.close();
    out = null;        
 }  catch (FileNotFoundException fnfe1) {
    Log.e("tag", fnfe1.getMessage());
  }
        catch (Exception e) {
    Log.e("tag", e.getMessage());
 }
}
于 2013-05-03T12:40:57.007 に答える