在Java中移动文件无法工作

3

我正在循环中尝试在文件加载和处理后移动文件...当我单独测试移动文件部分时它可以工作,但是当我一次性执行时它就不能工作。

下面的代码可以正常工作,但是会移动目录,而我只想要移动文件。

public class moveFiles {

    public static void main(String[] args) {
        String getFilesFrom = "D:\\show\\from";
        String destDir = "D:\\show\\to\\";

        File srcFile = new File(getFilesFrom);

        srcFile.renameTo(new File(destDir, srcFile.getName())); 

    }

}

我手头的代码在移动部分出了问题,以下是代码。

for (File child : file.listFiles()) {
    if(extensionFilter.accept(child)) { 
        fr = new FileReader(child);
        cm.copyIn("COPY ct"+addExtraZero+month+" FROM STDIN WITH DELIMITER ',' csv", fr);   
    } else {
        System.out.println("No File is elgible to be loaded");
        break;
    }
    getNumberOfFilesProcessed++;
    System.out.println("Loading now " + child.getName());
    child.renameTo(new File(moveFilesTo, child.getName()));
}
System.out.println("Number of files Loaded is: " + getNumberOfFilesProcessed);

以上代码为:
  • 从源目录获取文件
  • 将其加载到数据库中
  • 打印已加载的文件名
  • 获取已加载文件的数量
以上所有都能正常工作,但是最后一个部分即在加载后将文件移动到其他目录的部分不起作用。以下是应该移动文件的循环的部分。
child.renameTo(new File(moveFilesTo, child.getName()));

我已经苦思冥想了两个小时,希望能得到帮助。


你为什么在那里加了一个 break;?你是不是想要一个 continue; - daiscog
你好,因为我有 extensionFilter 来检查文件是否与过滤器不匹配,所以它应该中断代码... - hi4ppl
所以你希望一旦找到一个不符合筛选条件的文件,就立即跳出循环?目前,如果列表中的第一个文件不符合筛选条件,整个循环都会停止,其他文件也不会被处理。 - daiscog
你的程序输出“正在加载 [文件名]”,但没有移动该文件? - daiscog
是的,一切都正常,但是文件移动到我指定的另一个路径不起作用...我在不同的类中检查了那部分的功能,它可以工作,但这部分不行... - hi4ppl
显示剩余5条评论
1个回答

1

来自File.renameTo()的描述(本人强调):

重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是原子性的,并且如果目标抽象路径名已经存在,则可能无法成功。 始终应检查返回值以确保重命名操作成功。

添加:

if( !child.renameTo(new File(moveFilesTo, child.getName())) )
    System.out.println("Could not move file");

或者尝试使用move(Path, Path, CopyOption...)方法,因为它有更多选项(使用File.toPath())。

我现在收到这条消息(无法移动文件)...但是为什么第一段我展示的代码可以工作...它是相同的文件系统,只有目录不同...唯一的不同是循环... - hi4ppl
文件已存在? - Drgabble
目标完全为空... - hi4ppl
我不想使用不同的方法,因为我必须从头开始重写程序...因为上面展示的方法虽然在单个类中有效,但是当在循环中使用这个类时就无法工作... - hi4ppl
我认为它不需要从头开始重写,只需用move(child.toPath(), new File(moveFilesTo, child.getName()).toPath());替换该行即可。 - Drgabble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接