使用增量值创建新文件

时间:2014-04-10 16:47:17

标签: java file file-io directory

我需要创建一个具有给定名称的文件。

例如,“sampleFile”

如果在给定目录中存在这样的文件,那么我想创建附加'1'或'(1)'的文件。

“sampleFile1”

有没有办法做到这一点?

我正在寻找一种方法来命名新文件,因为文件夹从不同的系统更新,并且无法获得增量变量。

例如,int i = 1;

文件f =新文件(路径);

if(f.exists()){ f =新文件(路径+ i);

}

我无法遵循这样的技术,因为如果有一个名为sample1的文件,它可能会再次替换它。

根据最新的可用名称,我必须附加下一个值。

例如,如果我有样本27,我需要程序来理解并创建一个文件作为sample28

当我们复制文件并粘贴到同一文件夹时,Windows所执行的操作。我想在我的Java程序中复制它

感谢任何帮助:)

干杯!!!

5 个答案:

答案 0 :(得分:2)

也许你可以试试这样的东西?

String fileName = "sampleFile";
String newFilename;
File f = new File("path" + fileName);
int version = 1;
while (f.exists())
{
        newFilename= fileName + version;
        f = new File("path" + newFilename);
        version++;
}
f.mkdirs(); 
f.createNewFile();

答案 1 :(得分:2)

尝试使用当前日期将其附加到文件名,以便文件名始终是唯一的。

答案 2 :(得分:1)

现在复制文件内容。

这个实现完全适用于下面的示例集(您可以将其复制并粘贴到java文件中,它将编译并执行您想要的操作)。唯一可能的缺点是它会跳过“版本”。之间。因此,如果它有A1.txt和A3.txt,它只会创建A4.txt。它也无法处理没有扩展名的文件,但我认为这对你来说无关紧要。

它打印"失败"如果文件已经存在,或者由于某种原因导致文件创建失败。

请注意,您可以在命令行中指定文件目录,否则它将使用当前工作目录。

它还递归搜索下面的文件夹,如果您只想搜索当前/指定的文件目录,只需在return fileMap;方法的getFilesForFolder之前删除else语句。

<强>之前

〜/ currentDirectory所

  • A1.txt
  • A4.txt
  • B1.txt
  • 〜/ currentDirectory所/ ASDF
    • A1.txt
    • B1.txt
    • B5.txt

<强>后

〜/ currentDirectory所

  • A1.txt
  • A4.txt
  • A5.txt
  • B1.txt
  • B2.txt
  • 〜/ currentDirectory所/ ASDF
    • A1.txt
    • A2.txt
    • B1.txt
    • B5.txt
    • B6.txt

import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Map;
import java.util.HashMap;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class Files {
    static File folder;
    static List<String> files;

    public static void main(String[] args) {
        if (args.length > 0)
            folder = new File(args[0]);
        else
            folder = new File(System.getProperty("user.dir") + "/testfiles");


        Map<File, Map<String, Integer>> files = new HashMap<File, Map<String, Integer>>();
        files = getFilesForFolder(folder);
        writeFile(files); 
    }


    public static void writeFile(Map<File, Map<String, Integer>> files) {
        String fileName;

        for (Map.Entry<File, Map<String, Integer>> mapOfMapEntry : files.entrySet()) {
            File originalFile = mapOfMapEntry.getKey();
            for (Map.Entry<String, Integer> entry : (mapOfMapEntry.getValue()).entrySet()) {
                fileName = entry.getKey();
                try {
                    int i = fileName.contains(".") ? fileName.lastIndexOf('.') : fileName.length();
                    fileName = fileName.substring(0, i) + Integer.toString(entry.getValue() + 1) + fileName.substring(i);
                    File file = new File(fileName);

                    if (file.createNewFile()) {
                        System.out.println("Success: " + file.getAbsolutePath());
                        //File originalFile = new File(entry.getKey());
                        InputStream in = new FileInputStream(originalFile);
                        OutputStream out = new FileOutputStream(file);
                        byte[] buffer = new byte[1024];
                        int length;
                        while ((length = in.read(buffer)) > 0) {
                            out.write(buffer, 0, length);
                        }
                        in.close();
                        out.close();
                    } else {
                        //currently has duplicate value in map
                        //I tried to remove them but it was taking too long to debug
                        //I might come back to it later,
                        //otherwise you're just wasting a bit of computational resources
                        //by trying to create the same file multiple times
                        System.out.println("Failure: " + file.getAbsolutePath());
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    //note this is recursive and will search files
    //in subdirectories. you can change this by removing the else clause before return map
    public static Map<File, Map<String, Integer>> getFilesForFolder(File folder) {
        Map<File, Map<String, Integer>> mapOfMap = new HashMap<File, Map<String, Integer>>();
        Map<String, Integer> fileMap = new HashMap<String, Integer>();
        Integer number;

        //any non-digit character 0-inf amount of times, any digit character, 0-inf amount of times, 
        //then a period, then the rest of the extension
        Pattern pattern = Pattern.compile("(\\D*)(\\d*)(\\.\\w*)?"); 


        //match each file in the file directory with the above regex expr
        for (final File fileEntry : folder.listFiles()) {
            if (!(fileEntry.isDirectory())) {
                Matcher m = pattern.matcher(fileEntry.getAbsolutePath());
                while (m.find()) {
                    number = fileMap.get(m.group(1) + m.group(3));
                    if (number != null) {
                        //the key/value already exist in the filemap
                        //check to see if we should use the new number or not
                        if (Integer.parseInt(m.group(2)) > number) {
                            fileMap.put(m.group(1) + m.group(3), (Integer.parseInt(m.group(2))));
                            mapOfMap.put(fileEntry, fileMap);
                        }
                    } else if (!m.group(1).equals("")) {
                        //the map is empty and the file has no number appended to it
                        if (m.group(3) == null) {
                            fileMap.put(m.group(1), 0);
                            mapOfMap.put(fileEntry, fileMap);
                        } else {
                        //the map is empty and the file already has a number appended to it
                            fileMap.put(m.group(1) + m.group(3), (Integer.parseInt(m.group(2))));
                            mapOfMap.put(fileEntry, fileMap);
                        }
                    }
                }
            }
            else {
                for (Map.Entry<File, Map<String, Integer>> entry : getFilesForFolder(fileEntry).entrySet()) {
                    mapOfMap.put(entry.getKey(), entry.getValue());
                }
            }
        }
        return mapOfMap;
    }
}

答案 3 :(得分:0)

您也可以使用:

String filename="Sample";

int count=new File("").list(new FilenameFilter() {          
    @Override
    public boolean accept(File dir, String name) {
        if(name.contains(filename)) {
            return true;
        }
        return false;
    }
}).length;

String nextName=filename+count;

添加额外条件以避免重复

答案 4 :(得分:0)

让语言为您完成工作。使用java.nio包,并使用Path.resolveSibling方法。给定所需位置和文件名的路径,以及文件名和扩展名(可以通过apache FilenameUtils轻松获得),请执行以下操作:

Path createUniqueFilename(Path destFile, String filename, String extension) {
    Path updatedDestFile = destFile;
    for (int i = 1; Files.exists(updatedDestFile); i++) {
        String newFilename = String.format("%s(%d).%s", filename, i, extension);
        updatedDestFile = destFile.resolveSibling(newFilename);
    }
    return updatedDestFile;
}