首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件从文件系统复制到项目,并正确管理进度监视器。

将文件从文件系统复制到项目,并正确管理进度监视器。
EN

Stack Overflow用户
提问于 2014-10-13 08:24:28
回答 1查看 100关注 0票数 1

我试图修改that答案以满足我的需要,并使进度监视器能够正确地反映进度。到目前为止我的方法是:

代码语言:javascript
复制
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

代码语言:javascript
复制
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修改如下:

代码语言:javascript
复制
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(...)制作的。

在此之前:

之后:

EN

回答 1

Stack Overflow用户

发布于 2014-10-13 08:57:18

您需要在为beginTask方法创建的new SubProgressMonitor(monitor, fileCount)上调用copyFiles (和done)。

如果不调用beginTask,则忽略worked调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26335659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档