我需要创建一个具有给定名称的文件。
例如,“sampleFile”
如果在给定目录中存在这样的文件,那么我想创建附加'1'或'(1)'的文件。
“sampleFile1”
有没有办法做到这一点?
我正在寻找一种方法来命名新文件,因为文件夹从不同的系统更新,并且无法获得增量变量。
例如,int i = 1;
文件f =新文件(路径);
if(f.exists()){ f =新文件(路径+ i);
}
我无法遵循这样的技术,因为如果有一个名为sample1的文件,它可能会再次替换它。
根据最新的可用名称,我必须附加下一个值。
例如,如果我有样本27,我需要程序来理解并创建一个文件作为sample28
当我们复制文件并粘贴到同一文件夹时,Windows所执行的操作。我想在我的Java程序中复制它
感谢任何帮助:)
干杯!!!
答案 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所
<强>后强>:
〜/ currentDirectory所
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;
}