【问题标题】:Java renaming files in directory doesn't work properlyJava重命名目录中的文件无法正常工作
【发布时间】:2014-09-08 10:44:07
【问题描述】:

我正在尝试将给定目录中的所有文件重命名为大写。它做了整个事情,但它没有做任何事情文件夹中的文件名仍然相同。

import java.io.File;
import java.io.IOException;

public class FileOps {

    public static void main(String[] argv) throws IOException {

        File folder = new File(
                "C:\\Users\\N\\Desktop\\New folder\\RenamingFiles\\src\\renaming\\Files");
        File[] listOfFiles = folder.listFiles();

        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isFile()) {
                File f = new File(
                    "C:\\Users\\N\\Desktop\\New folder\\RenamingFiles\\src\\renaming\\Files"
                            + listOfFiles[i].getName());
                f.renameTo(new File(
                    "C:\\Users\\N\\Desktop\\New folder\\RenamingFiles\\src\\renaming\\Files"
                            + listOfFiles[i].getName().toUpperCase()
                            + ".txt"));
            }
        }

        System.out.println("Done");
    }
}

它在控制台中打印“完成”,但实际上什么也没做

【问题讨论】:

  • 目录中不是这样的文件,所以可能真的是因为我使用的是Windows 8的操作系统
  • Windows 对于只修改大小写的重命名可能会很有趣。尝试将它们完全重命名为其他名称(例如,在开头添加一个 _),然后将它们重命名为更改大小写。 (显然,您需要处理已经存在名为 _x 的文件的情况)
  • 您可以尝试移动这些文件,而不是重命名。它对我有用。 docs.oracle.com/javase/tutorial/essential/io/move.html

标签: java file-io


【解决方案1】:

在您的if 语句中,您忘记添加结束分隔符:

 if (listOfFiles[i].isFile()) {
        File f = new File(
                "C:\\Users\\N\\Desktop\\New folder\\RenamingFiles\\src\\renaming\\Files\\"// <- Missing separator
                        + listOfFiles[i].getName());
        f.renameTo(new File(
                "C:\\Users\\N\\Desktop\\New folder\\RenamingFiles\\src\\renaming\\Files\\"// <- Missing separator
                        + listOfFiles[i].getName().toUpperCase()
                        + ".txt"));
 }

正确的实现是:

if (listOfFiles[i].isFile()) 
         listOfFiles[i].renameTo(new File(folder, listOfFiles[i].getName().toUpperCase()+ ".txt"));//not sure why this .txt

小心,renameTo 方法高度依赖于平台。阅读Javadoc

【讨论】:

    【解决方案2】:

    您可以使用以下内容来检查正在发生的事情。一些小的更改包括使用File(parent,name) 表单以避免必须确定和添加特定于操作系统的文件路径分隔符。

    package com.example.renaming;
    
    import java.io.File;
    import java.io.IOException;
    
    public class TestRename {
        private static final String[] defaultArgs = { "C:\\Users\\N\\Desktop\\New folder\\RenamingFiles\\src\\renaming\\Files" };
        private static TestRename me;
        private static String[] arguments;
    
        public static void main(String[] args) {
            me = new TestRename();
            if (args == null | args.length == 0) {
                arguments = defaultArgs;
            } else {
                arguments = args;
            }
            me.doWork(arguments);
    
        }
    
        private void doWork(String[] arguments) {
            int numFiles = 0;
            File folder = new File(arguments[0]);
    
            try {
                System.out.println("Working on " + folder.getCanonicalPath());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            File[] fileList = folder.listFiles();
            if (fileList == null) {
                System.out.println("No files fould");
            } else {
    
                for (int i = 0; i < fileList.length; i++) {
                    System.out.println("File " + fileList[i].getName());
                    if (fileList[i].isFile()) {
                        numFiles++;
                        try {
                            String currentName = fileList[i].getName();
                            File parent = fileList[i].getParentFile();
                            String newName = currentName.toUpperCase() + ".txt";
                            System.out.println(" .. current = " + currentName);
                            System.out.println(" .. newname = " + newName);
    
                            // Avoids having to get the file path separator for an OS
                            File newFile = new File(parent, newName);
                            System.out.println(" .. new File = "
                                    + newFile.getCanonicalPath());
                            fileList[i].renameTo(newFile);
    
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
    
                System.out.println("Done, found " + numFiles);
    
            }
        }
    
    }
    

    【讨论】:

      【解决方案3】:

      正如ortis 所指出的,您在命名文件时错过了添加“\”。

                      f.renameTo(new File(
                      "C:\\Users\\N\\Desktop\\New folder\\RenamingFiles\\src\\renaming\\Files"
                              + listOfFiles[i].getName().toUpperCase()
                              + ".txt"));
      

      反复执行此代码将导致在文件名中添加 .txt。您可以考虑使用 apache FileUtils 来获取扩展。

      对您的代码进行这些更改,

      File folder = new File("/home/ubuntu/Desktop/pics");
      File[] listOfFiles = folder.listFiles();
      
      for(File file : listOfFiles){
          if(file.isFile()){          
              String fileName =   FilenameUtils.removeExtension(file.getName()).toUpperCase() ; 
              String newPath = folder + File.separator + fileName+ "."+ FilenameUtils.getExtension(file.getName());
              file.renameTo(new File(newPath));
          }
      }
      

      【讨论】:

      • 如何使用 gradle 将其添加到我的项目中?
      猜你喜欢
      • 2014-10-09
      • 1970-01-01
      • 2023-03-29
      • 2022-07-12
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多