0

我想删除文件中重复出现的文件,如果它存在不止一次,则只留下一个文件。

以下是我的代码。

import com.documentum.fc.client.IDfQuery;
import com.documentum.fc.client.IDfSession;
import com.documentum.fc.client.IDfSessionManager;
import com.documentum.fc.common.DfException;
import com.documentum.fc.common.DfId;
import com.documentum.fc.common.IDfLoginInfo;
import com.documentum.operations.IDfDeleteOperation;

public class CountFiles {

    // Documentum target repository where the files will be imported
    private static final String REPO_NAME = "rep";



    public static void main( String[] args ) throws Exception {

        try {
            String username = "user";
            String password = "pwd";

            System.out.println( "Starting to connect ..." );

            IDfSessionManager sessMgr = createSessionManager( );
            addIdentity( sessMgr, username, password);
            IDfSession sess = sessMgr.getSession(REPO_NAME );
            System.out.println( "Successfully connected to the server.");
            queryDocumentum(sess);


        } catch( Exception ex ) {
            System.out.println( ex );
            ex.printStackTrace( );
        }
    }


    private static void queryDocumentum(IDfSession sess) throws DfException {
    IDfQuery query = new DfQuery();
String queryStr= "select count(*) from dm_document where folder('/XXX/YYY', DESCEND) and object_name = 'abc.pdf' ";
    query.setDQL(queryStr);
    IDfCollection coll = query.execute(sess,IDfQuery.DF_EXEC_QUERY);
    while(coll.next())
    {
      int count = coll.getValueAt(0);
      if(count>1)
      {
       String qry = "delete dm_sysobject (all) objects where object_name='abc.pdf';";

        IDfQuery q= new DfQuery();
        query.setDQL(qry);
        IDfCollection col = query.execute(sess,IDfQuery.DF_EXEC_QUERY);


      }
    }
    coll.close();
}
/**
     * Creates a new session manager instance. The session manager does not have
     * any identities associated with it.
     *
     * @return a new session manager object.
     * @throws DfException
     */
    private static IDfSessionManager createSessionManager( ) 
            throws Exception {
        IDfClientX clientX = new DfClientX( );
        IDfClient localClient = clientX.getLocalClient( );
        IDfSessionManager sessMgr = localClient.newSessionManager( );

        System.out.println( "Created session manager." );

        return sessMgr;
    }

    /**
     * Adds a new identity to the session manager.
     *
     */
    private static void addIdentity( final IDfSessionManager sm, 
            final String username, final String password ) 
            throws Exception {
        IDfClientX clientX = new DfClientX( );

        IDfLoginInfo li = clientX.getLoginInfo( );
        li.setUser( username );
        li.setPassword( password );

        // check if session manager already has an identity.
        // if yes, remove it.
        if( sm.hasIdentity( REPO_NAME ) ) {
            sm.clearIdentity( REPO_NAME );

            System.out.println( "Cleared identity on :" + REPO_NAME );
        }

        sm.setIdentity( REPO_NAME, li );

        System.out.println( "Set up identity for the user." );
    }

}

但是我做手术的方式出了点问题。它不起作用。我没有在这里给出文件的路径,因为我不知道文件的确切路径。如果不给出文件的路径,就可以删除除一个之外的所有文件。

4

2 回答 2

0

我建议在您的 DQL 和逻辑中进行以下更改,这主要是因为您使用的是 DFC API:

数据质量:

//Retrieves all the root object ids of the documents version tree where there are duplicates as their name. 
//Here I thought the latest created document is the one to keep, you can adapt it to your needs - **see ORDER by clause**.

    select i_chronicle_id from dm_document where folder('/XXX/YYYY', DESCEND) and object_name in (select object_name from dm_document where folder('/XXX/YYYY', DESCEND) and object_name = 'abc.pdf' group by object_name having count(*) > 1) order by r_creation_date asc;

逻辑:

//"pseudo-code" - deletes the entire version tree of the document that is not the last in the returned list
while 'not last i_chronicle_id from the result collection' 
     //execute this dql: 
     `delete dm_document (all) objects where i_chronicle_id='<i_chronicle_id from the list>';`

希望这可以帮助,

艾米利亚

PS 我针对 CS 7.3 测试过的 DQL

于 2017-08-17T11:53:59.413 回答
0

如果您在 Java 中编写逻辑代码,请查看 IDfOperatiins。在指南中也很好地描述了这种做散装东西的方法。

于 2017-08-14T04:31:03.877 回答