Копировать файлы из файловой системы в проект и правильно управлять монитором прогресса

Я пытаюсь изменить этот ответ для своих нужд и сделать так, чтобы монитор прогресса отражал прогресс правильно. Мой подход до сих пор:

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 такт. Но это не движется вообще. В чем может быть причина и как решить проблему?

upd: я модифицировал метод 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(...) еще.

До:

введите описание изображения здесь

После:

введите описание изображения здесь

1 ответ

Вам нужно позвонить beginTask (а также done) на new SubProgressMonitor(monitor, fileCount) что вы создаете для copyFiles метод.

Если ты не позвонишь beginTask worked звонки игнорируются.

Другие вопросы по тегам