Jak przenieść plik z jednej lokalizacji do drugiej w Javie?
98
Jak przenieść plik z jednej lokalizacji do drugiej? Kiedy uruchamiam program, każdy plik utworzony w tej lokalizacji jest automatycznie przenoszony do określonej lokalizacji. Skąd mam wiedzieć, który plik został przeniesiony?
File # renameTo to robi (może nie tylko zmieniać nazwę, ale także przemieszczać się między katalogami, przynajmniej w tym samym systemie plików).
Zmienia nazwę pliku oznaczonego tą abstrakcyjną nazwą ścieżki.
Wiele aspektów zachowania tej metody jest z natury zależnych od platformy: operacja zmiany nazwy może nie być w stanie przenieść pliku z jednego systemu plików na inny, może nie być atomowy i może się nie powieść, jeśli plik z docelową abstrakcyjną nazwą ścieżki już istnieje. Zawsze należy sprawdzać zwracaną wartość, aby upewnić się, że operacja zmiany nazwy zakończyła się pomyślnie.
Jeśli potrzebujesz bardziej kompleksowego rozwiązania (na przykład chcesz przenieść plik między dyskami), spójrz na Apache Commons FileUtils # moveFile
myFile.renameTo (new File ("/ the / new / place / newname.file"));
djangofan,
4
Tak, nie podawaj tylko nowego katalogu nadrzędnego. I upewnij się, że ścieżka tam już istnieje.
Thilo
2
Zauważ, że myFileścieżka obiektu nie jest aktualizowana przez to polecenie. Więc będzie wskazywać na plik, którego już nie ma.
Evgeni Sergeev
1
@Sulemankhan - tak, usuwa również plik. Naprawdę przenosi to na system plików
leole
2
@JulienKronegg: To prawdopodobnie zależy od twojego systemu operacyjnego / systemu plików. Myślę, że w Linuksie można przenosić (lub usuwać) pliki, które są obecnie otwarte (i nadal uzyskiwać do nich dostęp przez istniejący uchwyt pliku), ale nie w systemie Windows.
Thilo
65
Dzięki Java 7 lub nowszej możesz używać Files.move(from, to, CopyOption... options).
Po prostu dodaj ścieżki folderów źródłowych i docelowych.
Przeniesie wszystkie pliki i folder z folderu źródłowego do folderu docelowego.
File destinationFolder = new File("");
File sourceFolder = new File("");
if (!destinationFolder.exists())
{
destinationFolder.mkdirs();
}
// Check weather source exists and it is folder.if (sourceFolder.exists() && sourceFolder.isDirectory())
{
// Get list of the files and iterate over them
File[] listOfFiles = sourceFolder.listFiles();
if (listOfFiles != null)
{
for (File child : listOfFiles )
{
// Move files to destination folder
child.renameTo(new File(destinationFolder + "\\" + child.getName()));
}
// Add if you want to delete the source folder
sourceFolder.delete();
}
}
else
{
System.out.println(sourceFolder + " Folder does not exists");
}
Możesz wykonać zewnętrzne narzędzie do tego zadania (jak copyw środowiskach Windows), ale aby zachować przenośność kodu, ogólne podejście jest następujące:
odczytać plik źródłowy do pamięci
zapisz zawartość do pliku w nowej lokalizacji
usuń plik źródłowy
File#renameTobędzie działać tak długo, jak długo źródło i lokalizacja docelowa będą na tym samym woluminie. Osobiście unikałbym używania go do przenoszenia plików do różnych folderów.
Napisałem tę metodę, aby zrobić to samo w moim własnym projekcie tylko z plikiem zastępowania, jeśli istnieje w nim logika.
// we use the older file i/o operations for this rather than the newer jdk7+ Files.move() operationprivatebooleanmoveFileToDirectory(File sourceFile, String targetPath){
File tDir = new File(targetPath);
if (tDir.exists()) {
String newFilePath = targetPath+File.separator+sourceFile.getName();
File movedFile = new File(newFilePath);
if (movedFile.exists())
movedFile.delete();
return sourceFile.renameTo(new File(newFilePath));
} else {
LOG.warn("unable to move file "+sourceFile.getName()+" to directory "+targetPath+" -> target directory does not exist");
returnfalse;
}
}
Odpowiedzi:
myFile.renameTo(new File("/the/new/place/newName.file"));
File # renameTo to robi (może nie tylko zmieniać nazwę, ale także przemieszczać się między katalogami, przynajmniej w tym samym systemie plików).
Jeśli potrzebujesz bardziej kompleksowego rozwiązania (na przykład chcesz przenieść plik między dyskami), spójrz na Apache Commons FileUtils # moveFile
źródło
myFile
ścieżka obiektu nie jest aktualizowana przez to polecenie. Więc będzie wskazywać na plik, którego już nie ma.Dzięki Java 7 lub nowszej możesz używać
Files.move(from, to, CopyOption... options)
.Na przykład
Files.move(Paths.get("/foo.txt"), Paths.get("bar.txt"), StandardCopyOption.REPLACE_EXISTING);
Więcej informacji można znaleźć w dokumentacji plików
źródło
Aby przenieść plik, możesz również użyć Jakarta Commons IOs FileUtils.moveFile
W przypadku błędu zgłasza an
IOException
, więc jeśli nie zostanie zgłoszony żaden wyjątek, wiesz, że plik został przeniesiony.źródło
File.renameTo
z Java IO można użyć do przeniesienia pliku w Javie. Zobacz także to pytanie SO .źródło
Po prostu dodaj ścieżki folderów źródłowych i docelowych.
Przeniesie wszystkie pliki i folder z folderu źródłowego do folderu docelowego.
File destinationFolder = new File(""); File sourceFolder = new File(""); if (!destinationFolder.exists()) { destinationFolder.mkdirs(); } // Check weather source exists and it is folder. if (sourceFolder.exists() && sourceFolder.isDirectory()) { // Get list of the files and iterate over them File[] listOfFiles = sourceFolder.listFiles(); if (listOfFiles != null) { for (File child : listOfFiles ) { // Move files to destination folder child.renameTo(new File(destinationFolder + "\\" + child.getName())); } // Add if you want to delete the source folder sourceFolder.delete(); } } else { System.out.println(sourceFolder + " Folder does not exists"); }
źródło
Java 6
public boolean moveFile(String sourcePath, String targetPath) { File fileToMove = new File(sourcePath); return fileToMove.renameTo(new File(targetPath)); }
Java 7 (przy użyciu NIO)
public boolean moveFile(String sourcePath, String targetPath) { boolean fileMoved = true; try { Files.move(Paths.get(sourcePath), Paths.get(targetPath), StandardCopyOption.REPLACE_EXISTING); } catch (Exception e) { fileMoved = false; e.printStackTrace(); } return fileMoved; }
źródło
Możesz wykonać zewnętrzne narzędzie do tego zadania (jak
copy
w środowiskach Windows), ale aby zachować przenośność kodu, ogólne podejście jest następujące:File#renameTo
będzie działać tak długo, jak długo źródło i lokalizacja docelowa będą na tym samym woluminie. Osobiście unikałbym używania go do przenoszenia plików do różnych folderów.źródło
Spróbuj tego :-
boolean success = file.renameTo(new File(Destdir, file.getName()));
źródło
Możesz użyć
Files
obiektuźródło
Napisałem tę metodę, aby zrobić to samo w moim własnym projekcie tylko z plikiem zastępowania, jeśli istnieje w nim logika.
// we use the older file i/o operations for this rather than the newer jdk7+ Files.move() operation private boolean moveFileToDirectory(File sourceFile, String targetPath) { File tDir = new File(targetPath); if (tDir.exists()) { String newFilePath = targetPath+File.separator+sourceFile.getName(); File movedFile = new File(newFilePath); if (movedFile.exists()) movedFile.delete(); return sourceFile.renameTo(new File(newFilePath)); } else { LOG.warn("unable to move file "+sourceFile.getName()+" to directory "+targetPath+" -> target directory does not exist"); return false; } }
źródło
Spróbuj tego.
private boolean filemovetoanotherfolder(String sourcefolder, String destinationfolder, String filename) { boolean ismove = false; InputStream inStream = null; OutputStream outStream = null; try { File afile = new File(sourcefolder + filename); File bfile = new File(destinationfolder + filename); inStream = new FileInputStream(afile); outStream = new FileOutputStream(bfile); byte[] buffer = new byte[1024 * 4]; int length; // copy the file content in bytes while ((length = inStream.read(buffer)) > 0) { outStream.write(buffer, 0, length); } // delete the original file afile.delete(); ismove = true; System.out.println("File is copied successful!"); } catch (IOException e) { e.printStackTrace(); }finally{ inStream.close(); outStream.close(); } return ismove; }
źródło
close
instrukcje znajdowały się wfinally
bloku lub gdyby używał bloku try-with-resources.Możesz spróbować tego… czystego rozwiązania
źródło
javax.script.ScriptException: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: REPLACE_EXISTING