Share via


Procedura: sincronizzare file utilizzando il codice non gestito

In questo argomento viene illustrato come utilizzare un linguaggio non gestito, ad esempio C++, per creare un'applicazione che sincronizzi file e sottocartelle mediante Sync Services for File Systems.

Questo argomento presuppone una conoscenza di base dei concetti relativi a C++ e COM.

Gli esempi riportati in questo argomento sono relativi alle interfacce Sync Framework seguenti:

Informazioni sulla sincronizzazione di file

Sync Services for File Systems implementa un provider di sincronizzazione che può essere utilizzato per sincronizzare file, cartelle e sottocartelle presenti in una cartella di un file system. Questo provider espone diverse impostazioni configurabili per fornire un grado di controllo più preciso sulla modalità di esecuzione della sincronizzazione e sugli elementi da sincronizzare. Per sincronizzare i file tra due cartelle, un'applicazione completa i seguenti passaggi di base:

  1. Crea un oggetto IFileSyncProvider per rappresentare ogni cartella.

  2. Passa i due provider a un oggetto ISyncSession e ne specifica uno come provider di origine e l'altro come provider di destinazione.

  3. Avvia la sessione di sincronizzazione.

Per ulteriori informazioni sulla sincronizzazione di file, vedere Sync Services for File Systems.

Requisiti di compilazione

  • Synchronization.h: dichiarazioni per i componenti principali di Sync Framework.

    #include <synchronization.h>
    
  • FileSyncProvider.h: dichiarazioni per i componenti di Sync Services for File Systems.

    #include <filesyncprovider.h>
    
  • Synchronization.lib: libreria di importazione per i componenti principali di Sync Framework.

  • FileSyncProvider.lib: libreria di importazione per i componenti di Sync Services for File Systems.

Esempio

Nel codice di esempio vengono illustrate le attività seguenti:

  • Creazione e inizializzazione di due provider di sincronizzazione dei file, uno di origine e uno di destinazione.

  • Configurazione di un filtro per il controllo degli elementi da includere nella sincronizzazione.

  • Utilizzo di una sessione di sincronizzazione per sincronizzare gli elementi tra le cartelle rappresentate dai provider.

In questo esempio viene utilizzata una finestra di dialogo MFC (Microsoft Foundation Classes) per ottenere dall'utente informazioni su cartelle e filtri. Le stringhe immesse da un utente vengono assemblate in oggetti CString, i quali vengono quindi utilizzati per inizializzare i provider e il filtro.

Creazione e inizializzazione di un provider di sincronizzazione dei file

Creare un oggetto IFileSyncProvider mediante CoCreateInstance.

IFileSyncProvider* pProvSrc = NULL;
hr = CoCreateInstance(CLSID_FileSyncProvider, NULL, CLSCTX_INPROC_SERVER, 
    __uuidof(pProvSrc), (void**)&pProvSrc);

Il provider deve essere inizializzato prima di poter essere utilizzato. Si tratta inoltre di un'opportunità per configurare le impostazioni. Questa implementazione passa un filtro, pFilter, per controllare gli elementi da includere nella sincronizzazione. Nella sezione successiva viene illustrata la configurazione del filtro.

hr = pProvSrc->Initialize(*pguidReplicaSrc, pstrFolderSrc->GetString(),
    pstrMetaSrc->GetString(), NULL, 
    FILESYNC_INIT_FLAGS_NONE, pFilter, NULL, NULL);

Utilizzo di un filtro ambito per la sincronizzazione dei file

Creare un filtro tramite il metodo IFileSyncProvider::CreateNewScopeFilter. Questo nuovo filtro non ha alcuna relazione con il provider di creazione. Per connettere un filtro a un provider, passarlo al metodo IFileSyncProvider::Initialize. Ciò significa che è necessario creare un solo filtro per sessione di sincronizzazione, perché lo stesso filtro può essere passato a entrambi i provider. È importante considerare che le informazioni sul filtro vengono archiviate dal provider nel metodo Initialize. Pertanto, le modifiche apportate successivamente al filtro non verranno applicate al provider.

Questa implementazione ottiene i valori delle opzioni di filtro dall'utente mediante una finestra di dialogo MFC. Il codice della finestra di dialogo non viene visualizzato. I valori delle opzioni vengono tuttavia archiviati in diversi oggetti CString, ad esempio m_strFilenameExc. Nell'esempio le opzioni del filtro vengono impostate sui valori forniti dall'utente.

// Create a scope filter and fill it (some strings may be empty).
IFileSyncScopeFilter* pFilter = NULL;
hr = pProvSrc->CreateNewScopeFilter(&pFilter);
if (SUCCEEDED(hr))
{
    hr = pFilter->SetFilenameExcludes(m_strFilenameExc.GetString());

    if (SUCCEEDED(hr))
    {
        hr = pFilter->SetSubDirectoryExcludes(m_strDirExc.GetString());
    }

    if (SUCCEEDED(hr))
    {
        DWORD dwMask = wcstoul(m_strAttrExc.GetString(), NULL, 16);
        hr = pFilter->SetFileAttributeExcludeMask(dwMask);
    }

    if (SUCCEEDED(hr))
    {
        // Only set the include list if we have something in it, because
        // setting the include list to empty effectively excludes all files.
        if (!m_strFilenameInc.IsEmpty())
        {
            hr = pFilter->SetFilenameIncludes(m_strFilenameInc.GetString());
        }
    }

    if (SUCCEEDED(hr))
    {
        // Initialize the providers.
        hr = pProvSrc->Initialize(*pguidReplicaSrc, pstrFolderSrc->GetString(),
            pstrMetaSrc->GetString(), NULL, 
            FILESYNC_INIT_FLAGS_NONE, pFilter, NULL, NULL);
        if (SUCCEEDED(hr))
        {
            hr = pProvDest->Initialize(*pguidReplicaDest, pstrFolderDest->GetString(),
                pstrMetaDest->GetString(), NULL, 
                FILESYNC_INIT_FLAGS_NONE, pFilter, NULL, NULL);
        }
    }

    pFilter->Release();
}

Avvio della sincronizzazione

Dopo la configurazione e l'inizializzazione dei provider e del filtro, creare e avviare una sessione di sincronizzazione.

IApplicationSyncServices* pSvc = NULL;
hr = CoCreateInstance(CLSID_SyncServices, NULL, CLSCTX_INPROC_SERVER, 
    IID_IApplicationSyncServices, (void**)&pSvc);
if (SUCCEEDED(hr))
{
    ISyncSession* pSession = NULL;
    hr = pSvc->CreateSyncSession(pProvDest, pProvSrc, &pSession);
    if (SUCCEEDED(hr))
    {
        SYNC_SESSION_STATISTICS syncStats;
        hr = pSession->Start(CRP_NONE, &syncStats);

        pSession->Release();
    }

    pSvc->Release();
}

Esempio di codice completo

Il codice seguente è il codice completo per questo esempio. Gli esempi precedenti di questa sezione sono stati ricavati da questo codice.

HRESULT CFileSynchronizerDlg::Synchronize(const GUID* pguidReplicaSrc, CString* pstrFolderSrc, 
    CString* pstrMetaSrc, const GUID* pguidReplicaDest, CString* pstrFolderDest, 
    CString* pstrMetaDest)
{
    HRESULT hr = E_UNEXPECTED;

    // Create the source and destination providers.
    IFileSyncProvider* pProvSrc = NULL;
    hr = CoCreateInstance(CLSID_FileSyncProvider, NULL, CLSCTX_INPROC_SERVER, 
        __uuidof(pProvSrc), (void**)&pProvSrc);
    if (SUCCEEDED(hr))
    {
        IFileSyncProvider* pProvDest = NULL;
        hr = CoCreateInstance(CLSID_FileSyncProvider, NULL, CLSCTX_INPROC_SERVER, 
            __uuidof(pProvDest), (void**)&pProvDest);
        if (SUCCEEDED(hr))
        {
            // Create a scope filter and fill it (some strings may be empty).
            IFileSyncScopeFilter* pFilter = NULL;
            hr = pProvSrc->CreateNewScopeFilter(&pFilter);
            if (SUCCEEDED(hr))
            {
                hr = pFilter->SetFilenameExcludes(m_strFilenameExc.GetString());

                if (SUCCEEDED(hr))
                {
                    hr = pFilter->SetSubDirectoryExcludes(m_strDirExc.GetString());
                }

                if (SUCCEEDED(hr))
                {
                    DWORD dwMask = wcstoul(m_strAttrExc.GetString(), NULL, 16);
                    hr = pFilter->SetFileAttributeExcludeMask(dwMask);
                }

                if (SUCCEEDED(hr))
                {
                    // Only set the include list if we have something in it, because
                    // setting the include list to empty effectively excludes all files.
                    if (!m_strFilenameInc.IsEmpty())
                    {
                        hr = pFilter->SetFilenameIncludes(m_strFilenameInc.GetString());
                    }
                }

                if (SUCCEEDED(hr))
                {
                    // Initialize the providers.
                    hr = pProvSrc->Initialize(*pguidReplicaSrc, pstrFolderSrc->GetString(),
                        pstrMetaSrc->GetString(), NULL, 
                        FILESYNC_INIT_FLAGS_NONE, pFilter, NULL, NULL);
                    if (SUCCEEDED(hr))
                    {
                        hr = pProvDest->Initialize(*pguidReplicaDest, pstrFolderDest->GetString(),
                            pstrMetaDest->GetString(), NULL, 
                            FILESYNC_INIT_FLAGS_NONE, pFilter, NULL, NULL);
                    }
                }

                pFilter->Release();
            }

            if (SUCCEEDED(hr))
            {
                // Synchronize!
                IApplicationSyncServices* pSvc = NULL;
                hr = CoCreateInstance(CLSID_SyncServices, NULL, CLSCTX_INPROC_SERVER, 
                    IID_IApplicationSyncServices, (void**)&pSvc);
                if (SUCCEEDED(hr))
                {
                    ISyncSession* pSession = NULL;
                    hr = pSvc->CreateSyncSession(pProvDest, pProvSrc, &pSession);
                    if (SUCCEEDED(hr))
                    {
                        SYNC_SESSION_STATISTICS syncStats;
                        hr = pSession->Start(CRP_NONE, &syncStats);

                        pSession->Release();
                    }

                    pSvc->Release();
                }
            }

            pProvDest->Release();
        }

        pProvSrc->Release();
    }

    return hr;
}

Vedere anche

Riferimento

Interfaccia IFileSyncProvider
Interfaccia IFileSyncScopeFilter

Concetti

Componenti di Sync Services for File Systems

Altre risorse

Sync Services for File Systems