Cześć wam, postanowiłem znów zabrać się za naukę programowania i chciałbym ukończyć program który pomoże mi posortować pliki zdjęć według daty ich wykonania. Chce aby program pobierał datę z EXIF zdjęcia, tworzył folder o nazwie "miesiąc rok" i przenosił zdjęcie do folderu. Coś tam już napisałem ale mam problem z przeniesieniem plików, i z rekurencyjną metodą "MakeListOfFiles" nie wiem czy dobrze to zaprogramowałem tak aby ListOfPhotos aktualizował się o kolejne zdjęcia w sytuacji gdy natknę się na kolejny katalog z kolejnymi zdjęciami wewnątrz katalogu głównego.
Pozdrawiam i liczę na podpowiedź
dodam tylko że błąd jaki wywala przy przenoszeniu to
java.io.FileNotFoundException: C:\Users\IM\Desktop\Zdjecia\2 2017 (Odmowa dostępu)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at apps.photoSort.App.SortFiles(App.java:60)
at apps.photoSort.App.main(App.java:29)
package apps.photoSort;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifSubIFDDirectory;
public class App {
public static void main(String[] args) {
String sourceDirPath = "C:/Users/IM/Desktop/Zdjecia/";
File sourceDirectory = new File(sourceDirPath);
if (!sourceDirectory.isDirectory()) {
System.out.println("It is not directory");
}
SortFiles(sourceDirectory);
}
private static void SortFiles(File sourceDirectory) {
ArrayList<File> ArrayOfPhotos = MakeListOfFiles(sourceDirectory);
Iterator<File> ArrayOfPhotosIterator = ArrayOfPhotos.iterator();
while (ArrayOfPhotosIterator.hasNext()) {
try {
File nextPhoto = ArrayOfPhotosIterator.next();
Metadata metadata = ImageMetadataReader.readMetadata(nextPhoto);
ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
Date date = directory.getDate(ExifSubIFDDirectory.TAG_DATETIME_ORIGINAL);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
StringBuilder newDir = new StringBuilder();
newDir.append(sourceDirectory.toString());
newDir.append("/" + month + " " + year);
File newDirectory = new File(newDir.toString());
System.out.println(newDirectory.toString());
newDirectory.mkdirs();
newDirectory.setWritable(true);
InputStream inStream = null;
OutputStream outStream = null;
File oldFile = new File(nextPhoto.toString());
File newFile = new File(newDirectory.toString());
inStream = new FileInputStream(oldFile);
outStream = new FileOutputStream(newFile);
byte[] buffer = new byte[1024];
int length;
while ((length = inStream.read(buffer)) > 0) {
outStream.write(buffer, 0, length);
}
inStream.close();
outStream.close();
oldFile.delete();
System.out.println("Plik zostal przeniesiony poprawnie!");
} catch (ImageProcessingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static ArrayList<File> MakeListOfFiles(File sourceDirectory) {
File[] files = sourceDirectory.listFiles();
ArrayList<File> ListOfPhotos = new ArrayList<>();
if (files != null) {
for (File f : files) {
if (!f.isDirectory()) {
ListOfPhotos.add(f);
} else {
MakeListOfFiles(f);
}
}
}
return ListOfPhotos;
}
}