Dividir y Combinar Archivos PST

La API de Aspose.Email proporciona la capacidad de dividir un solo archivo PST en múltiples archivos PST de tamaño deseado. También puede combinar múltiples archivos PST en un solo archivo PST. Tanto las operaciones de división como de combinación de PST se pueden rastrear agregando eventos a estas operaciones.

Dividir y Combinar Archivos PST

Los siguientes ejemplos de código ilustran cómo dividir un archivo PST grande en múltiples fragmentos pequeños de archivos PST.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String sourceFileName = dataDir + "source.pst";
final PersonalStorage pst = PersonalStorage.fromFile(sourceFileName);
try {
pst.StorageProcessed.add(new StorageProcessedEventHandler() {
public void invoke(Object sender, StorageProcessedEventArgs e) {
pstSplit_OnStorageProcessed(sender, e);
}
});
pst.ItemMoved.add(new ItemMovedEventHandler() {
public void invoke(Object sender, ItemMovedEventArgs e) {
pstSplit_OnItemMoved(sender, e);
}
});
deleteAllFilesInDirectory(new File(dataDir + "chunks/"));
pst.splitInto(542720 , dataDir + "chunks/");
} finally {
if (pst != null)
(pst).dispose();
}

Combinando Múltiples PST en un Solo PST

El siguiente ejemplo de código muestra cómo múltiples PST se pueden combinar en un solo archivo PST grande.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Path to files that will be merged into "source.pst".
String mergeWithFolderPath = dataDir + "MergeWith";
String mergeIntoFolderPath = dataDir + "MergeInto" + File.separator;
// This will ensure that we can run this example as many times as we want.
// It will discard changes made to to the Source file in last run of this example.
deleteAndRecopySampleFiles(mergeIntoFolderPath, dataDir + "MergeMultiplePSTsIntoASinglePST/");
final PersonalStorage pst = PersonalStorage.fromFile(mergeIntoFolderPath + "source.pst");
try {
pst.StorageProcessed.add(new StorageProcessedEventHandler() {
public void invoke(Object sender, StorageProcessedEventArgs e) {
pstMerge_OnStorageProcessed(sender, e);
}
});
pst.ItemMoved.add(new ItemMovedEventHandler() {
public void invoke(Object sender, ItemMovedEventArgs e) {
pstMerge_OnItemMoved(sender, e);
}
});
//Get a collection of all files in the directory
ArrayList<String> results = new ArrayList<String>();
File[] files = new File(mergeWithFolderPath).listFiles();
//If this path name does not denote a directory, then listFiles() returns null.
if (files == null)
return;
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".pst")) {
results.add(file.getAbsolutePath());
}
}
String[] fileNames = results.toArray(new String[0]);
pst.mergeWith(fileNames);
} finally {
if (pst != null)
(pst).dispose();
}

Combinar Carpetas de Otro PST

La API de Aspose.Email permite combinar carpetas completas de otro PST a un PST de destino, resultando en un archivo PST de gran tamaño.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String sourceFileName = dataDir + "Sources/source.pst";
String destinationFolder = dataDir + "Destination" + File.separator;
String destinationFileName = "destination.pst";
// This will ensure that we can run this example as many times as we want.
// It will discard changes made to to the destination file "destination.pst" in last run of this example.
deleteAndRecopySampleFiles(destinationFolder, dataDir + "MergeFoldersFromAnotherPST" + File.separator);
final PersonalStorage destinationPst = PersonalStorage.fromFile(destinationFolder + destinationFileName);
try {
final PersonalStorage sourcePst = PersonalStorage.fromFile(sourceFileName);
try {
FolderInfo destFolder = destinationPst.getRootFolder().addSubFolder("FolderFromOtherPst" + (int) (Math.random() * 100));
FolderInfo sourceFolder = sourcePst.getPredefinedFolder(StandardIpmFolder.Inbox);
destFolder.ItemMoved.add(new ItemMovedEventHandler() {
public void invoke(Object sender, ItemMovedEventArgs e) {
destinationFolder_ItemMoved(sender, e);
}
});
destFolder.mergeWith(sourceFolder);
System.out.println("Total messages added: " + totalAdded);
} finally {
if (sourcePst != null)
(sourcePst).dispose();
}
} finally {
if (destinationPst != null)
(destinationPst).dispose();
}

Dividir PST Basado en Criterio Definido

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
String fileName = dataDir + "source.pst";
java.util.Calendar c = java.util.Calendar.getInstance();
List<MailQuery> criteria = new List<MailQuery>();
//Define a criterion based on Time
PersonalStorageQueryBuilder pstQueryBuilder = new PersonalStorageQueryBuilder();
c.set(2015, 1, 1, 0, 0, 0);
pstQueryBuilder.getSentDate().since(c.getTime());
c.set(2015, 12, 12, 0, 0, 0);
pstQueryBuilder.getSentDate().before(c.getTime());
criteria.addItem(pstQueryBuilder.getQuery());
//specify some other criterion as well
pstQueryBuilder = new PersonalStorageQueryBuilder();
c.set(2012, 1, 1, 0, 0, 0);
pstQueryBuilder.getSentDate().since(c.getTime());
c.set(2012, 12, 12, 0, 0, 0);
pstQueryBuilder.getSentDate().before(c.getTime());
criteria.addItem(pstQueryBuilder.getQuery());
final PersonalStorage pst = PersonalStorage.fromFile(fileName);
try {
deleteAllOutputFiles();
pst.splitInto(criteria, dataDir);
} finally {
if (pst != null)
pst.dispose();
}

Métodos de Ayuda

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
private static void destinationFolder_ItemMoved(Object sender, ItemMovedEventArgs e) {
totalAdded++;
}
private static void pstMerge_OnStorageProcessed(Object sender, StorageProcessedEventArgs e) {
System.out.println("*** The storage is merging: {0}" + e.getFileName());
}
private static void pstMerge_OnItemMoved(Object sender, ItemMovedEventArgs e) {
if (currentFolder == null) {
currentFolder = e.getDestinationFolder().retrieveFullPath();
}
String folderPath = e.getDestinationFolder().retrieveFullPath();
if (!folderPath.equals(currentFolder)) {
System.out.println(" Added " + messageCount + " messages to " + currentFolder);
messageCount = 0;
currentFolder = folderPath;
}
messageCount++;
totalAdded++;
}
private static void pstSplit_OnStorageProcessed(Object sender, StorageProcessedEventArgs e) {
if (currentFolder != null) {
System.out.println(" Added " + messageCount + " messages to " + currentFolder);
}
messageCount = 0;
currentFolder = null;
System.out.println("*** The chunk is processed: " + e.getFileName());
}
private static void pstSplit_OnItemMoved(Object sender, ItemMovedEventArgs e) {
if (currentFolder == null) {
currentFolder = e.getDestinationFolder().retrieveFullPath();
}
String folderPath = e.getDestinationFolder().retrieveFullPath();
if (!folderPath.equals(currentFolder)) {
System.out.println(" Added " + messageCount + " messages to " + currentFolder);
messageCount = 0;
currentFolder = folderPath;
}
messageCount++;
}
public static void deleteAndRecopySampleFiles(String destFolder, String srcFolder) {
try {
deleteAllFilesInDirectory(new File(destFolder));
File source = new File(srcFolder);
File dest = new File(destFolder);
FileUtils.copyDirectory(source, dest);
} catch(IOException e) {
System.out.println(e.getLocalizedMessage());
}
}
public static void deleteAllFilesInDirectory(File dir) {
for(String s: dir.list()){
File currentFile = new File(dir.getPath(), s);
currentFile.delete();
}
}
public static void deleteAllOutputFiles() {
File dir = new File(dataDir);
for(String s: dir.list()){
if(s.startsWith("Test_part") || s.startsWith("Personal folders_part")) {
File file = new File(dir.getPath(), s);
file.delete();
}
}
}