Я пытаюсь изменить ответ that для своих нужд и сделать монитор прогресса соответствующим образом отражать ход. Мой подход до сих пор:Скопируйте файлы из файловой системы в проект и правильно управляйте монитором прогресса
import org.eclipse.core.runtime.SubProgressMonitor;
private void configureProject(IProgressMonitor monitor)
throws CoreException, IOException
{
try
{
URL templatesURL = Activator.getDefault().getBundle().getEntry(TEMPLATES);
File templatesFolder = new File(FileLocator.toFileURL(templatesURL).getPath());
int fileCount = getElementsCount(templatesFolder);
monitor.beginTask("Creating file structure for new project...", fileCount + 5);
project.getFolder(P_SRC).delete(true, new SubProgressMonitor(monitor, 1));
project.getFolder(P_BIN).delete(true, new SubProgressMonitor(monitor, 1));
copyFiles(templatesFolder, project, new SubProgressMonitor(monitor, fileCount));
project.getFile(P_TOUCH).delete(true, new SubProgressMonitor(monitor, 1));
IClasspathEntry[] newEntries = new IClasspathEntry[3];
newEntries[0] = JavaCore.newSourceEntry(getCreatedElement().getPath().append(SRC_MAIN));
newEntries[1] = JavaCore.newSourceEntry(getCreatedElement().getPath().append(SRC_RES),
EXCLUDE_ALL);
newEntries[2] = JavaCore.newSourceEntry(getCreatedElement().getPath().append(SRC_TEST));
javaProject.setRawClasspath(newEntries, new SubProgressMonitor(monitor, 2));
}
finally
{
if (!monitor.isCanceled())
monitor.done();
}
}
private int getElementsCount(File file)
{
// return number of files and folders in the file
}
Как вы видите, у меня есть 3 тика для операций удаления и 2 для установки пути к классам. Это 5 плюс количество файлов в исходной папке, если я говорю: 1 тик на файл или папку. Теперь у меня проблема с методом copyFiles
. Я изменил соответствующий код для работы с IProgressMonitor
:
private void copyFiles(File srcFolder, IContainer destFolder, IProgressMonitor monitor)
throws CoreException, IOException
{
for (File f : srcFolder.listFiles())
{
if (f.isDirectory())
{
IFolder newFolder = destFolder.getFolder(new Path(f.getName()));
newFolder.create(true, true, new SubProgressMonitor(monitor, 1));
copyFiles(f, newFolder, monitor);
}
else
{
newFile.create(new FileInputStream(f), true, new SubProgressMonitor(monitor, 1));
}
}
}
Как только один из методов create(...)
называется (либо на IFile
или на IFolder
) прогресс бар должен быть перемещен на 1 тик. Но это совсем не движется. Что может быть причиной и как решить проблему?
обн: Я модифицировал метод configureProject
следующим образом:
SubProgressMonitor copyFilesMonitor = new SubProgressMonitor(monitor, fileCount);
copyFilesMonitor.beginTask("Copying files...", fileCount);
copyFiles(templatesFolder, project, copyFilesMonitor);
copyFilesMonitor.done();
Теперь проблема заключается в том, что после вызова create()
(либо на IFolder
или на IFile
) прогрессбар установлен на 2/3 - 2 тика. 2/3 предназначен для всего метода configureProject()
, и последние 2 тика должны быть сделаны еще setRawClasspath(...)
.
До:
После:
Вы вызываете 'copyFiles' рекурсивно, поэтому вы вызываете' done' слишком рано –
Вы правы, спасибо за этот намек. Однако это не решение проблемы. 'done' не вызывается в' copyFiles', а в 'create'. Он должен применяться к «SubProgressMonitor», но, по-видимому, он применяется к родительскому монитору. –