搜索共享驱动器以根据非法字符重命名文件

时间:2015-08-01 17:03:38

标签: java io

我正在尝试用Java创建一个模块化程序,它将搜索共享驱动器并返回所有文件名,然后过滤掉并重命名名称中包含非法字符的文件(例如/:*?“<> |')

我意识到Windows几乎每个字符都不允许作为文件名的一部分,但是它们都是作为列表的一部分给出的。到目前为止,我所拥有的代码有点混乱,是一种协作努力。我能够成功地将文件从一个目录复制到另一个目录,但生成的文件是空白的。如何正确获取文件并将其中包含的所有数据复制到新目录中,并从文件名中删除所有违规字符实例?

如果此问题的任何部分代表了常见问题解答中的重复,我们深表歉意。

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.util.Scanner;

import static java.nio.file.StandardCopyOption.*;

public class FileIO {
    public static void main(String[] args) throws IOException {
        String location = "C:\\Users\\000000000\\Desktop\\TestFiles";
        File[] files = new File(location).listFiles();
        new File(location + "/Altered/").mkdir();
        String fileName;
        for (File file : files) {
            file.toString();
            fileName = file.toString();
            String[] array = fileName.split("\\\\");
            fileName = array[array.length - 1];
            fileName = fileName.replaceAll("\\\\", "");
            fileName = fileName.replaceAll("/", "");
            fileName = fileName.replaceAll(":", "");
            fileName = fileName.replaceAll("\\*", "");
            fileName = fileName.replaceAll("\\?", "");
            fileName = fileName.replaceAll("\"", "");
            fileName = fileName.replaceAll("<", "");
            fileName = fileName.replaceAll(">", "");
            fileName = fileName.replaceAll("|", "");
            fileName = fileName.replaceAll("'", "");

            System.out.println(fileName);

            File outfile = new File(location + "/altered/" + fileName);
            if (!outfile.exists()) {
                try {
                    outfile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            PrintWriter outFile = new PrintWriter(new BufferedWriter(
                    new FileWriter(outfile, true)));
            Scanner inFile = new Scanner(file);
            while (inFile.hasNext()) {
                String line = inFile.nextLine();
                System.out.println(line);
                if (line != null) {

                    outFile.println(line);
                }
                continue;
            }
        }
    }
} 

2 个答案:

答案 0 :(得分:0)

您的代码看起来对我很好 - 您应该解释为什么它在您的问题中无效。

使用Java 8方法Files.walk()和Files.walkFileTree()(后者可能在早期的java版本中可用),而不是for循环,您会发现这种任务更容易。

答案 1 :(得分:0)

我看到一些问题:

  • 如果文件的名称包含非法字符,则它不应该存在。在Windows中,非法字符为/&lt;&gt;:*?“|(其中有9个)。但简单的引用是有效的。
  • 祝你好运,试图创建这些文件。他们已经存在吗?你期望如何创造它们?
  • 好像你已经回答了你的问题。你有什么具体的困难?
  • 当我在代码中读到时,您将从源文件逐行复制到目标文件中。如果您按照标题中的说明重命名,则应使用File#renameTo(File)方法。如果您要复制文件,则应按块而不是行进行。 Java 8 NIO中有一些新的Files#copy(Path,Path,CopyOption...)。 (https://docs.oracle.com/javase/tutorial/essential/io/copy.html