IMAPI: не удается удалить файлы.MP4 с диска локации после завершения записи

Я использую windows 7 и записываю DVD используя imapi2. после завершения DVD сжечь. Я хочу удалить файлы из локального каталога на диске. но когда я пытаюсь удалить эти файлы. некоторые файлы не удаляются с локального HD.

я пытаюсь записать DVD с Microsoft SDK образец кода IMAPISAMPLE2.cpp

1 ответ

Используйте Process Explorer (пункт меню Find|Find Handle или DLL), чтобы узнать, какие процессы имеют дескрипторы открытых файлов, которые вы не можете удалить. Если один из процессов является вашим записывающим, возможно, вы не вызываете какой-либо API imapi2 для выключения записи?

HRESULT DataWriter()
{

    HRESULT           hr = S_OK;
    IDiscRecorder2*   discRecorder = NULL;
    IDiscFormat2Data* dataWriter = NULL;
    IStream*          dataStream = NULL;
    BOOLEAN           dualLayerDvdMedia = FALSE;
    ULONG             index = 0;//options.WriterIndex;
    VARIANT_BOOL      isBlank = FALSE;

    SYSTEMTIME startTime;
    SYSTEMTIME endTime;


    IFileSystemImage *       image = NULL;
    IFileSystemImageResult * fsiresult = NULL;
    IFsiDirectoryItem *      root = NULL;
    BSTR                     dir = ::SysAllocString( _T("D:\\DVDRecording") );
    IBootOptions *           pBootOptions = NULL;
    IStream *                bootStream = NULL;


    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_MsftDiscFormat2Data,
                              NULL, CLSCTX_ALL,
                              IID_PPV_ARGS(&dataWriter)
                              );
    }
    // create a DiscRecorder object


    if (SUCCEEDED(hr))
    {
        hr = GetDiscRecorder(index, &discRecorder);
    }

    // Set the recorder as the recorder for the data writer
    if (SUCCEEDED(hr))
    {
        VARIANT_BOOL bRetur;
        hr = dataWriter->IsRecorderSupported( discRecorder, &bRetur);
        hr = dataWriter->put_Recorder(discRecorder);
    }

    // Set the app name for use with exclusive access
    // THIS IS REQUIRED
    if (SUCCEEDED(hr))
    {
        BSTR appName = ::SysAllocString(L"DVDrecording");

        hr = dataWriter->put_ClientName(appName);

        FreeSysStringAndNull(appName);
    }

    // verify the SupportedMediaTypes property gets
    if (SUCCEEDED(hr))
    {
        SAFEARRAY * value = NULL;
        hr = dataWriter->get_SupportedMediaTypes(&value);

        SafeArrayDestroyData(value);       \
        value = NULL;    
    }


    // get a stream to write to the disc
    // create a ID_IFileSystemImage object
    if (SUCCEEDED(hr))
    {
        hr = CoCreateInstance(CLSID_MsftFileSystemImage,
                              NULL, CLSCTX_ALL,
                              IID_PPV_ARGS(&image)
                              );
    }

    // Set the filesystems to use if specified
    if (SUCCEEDED(hr) )//(options.Iso || options.Joliet || options.UDF))
    {
        FsiFileSystems fileSystem = FsiFileSystemUDF;

        hr = image->put_FileSystemsToCreate(fileSystem);
    }

    // Get the root dir
    if (SUCCEEDED(hr))
    {       
        hr = image->get_Root(&root);
    }

    // Check if media is blank
    if (SUCCEEDED(hr))
    {
        hr = dataWriter->get_MediaHeuristicallyBlank(&isBlank);
    }

    // ImportFileSystem - Import file data from disc
    if (SUCCEEDED(hr) && !isBlank )
    {       
        FsiFileSystems fileSystems;
        SAFEARRAY* multiSession = NULL;

        // Get mutlisession interface to set in image
        if (SUCCEEDED(hr))
        {        
            hr = dataWriter->get_MultisessionInterfaces(&multiSession);
        }

        // Set the multisession interface in the image
        if (SUCCEEDED(hr))
        {
            hr = image->put_MultisessionInterfaces(multiSession);

            if (FAILED(hr))
            {
                if (multiSession != NULL)
                {
                    SafeArrayDestroy(multiSession);
                }
            }
            multiSession = NULL;
        }

        if (SUCCEEDED(hr))
        {
            hr = image->ImportFileSystem(&fileSystems);
            if (FAILED(hr))
            {
                if (hr == IMAPI_E_EMPTY_DISC)
                {
                     hr = S_OK;
                }

            }
        }
    }

    // Get free media blocks
    if (SUCCEEDED(hr))
    {
        LONG freeBlocks;

        hr = dataWriter->get_FreeSectorsOnMedia(&freeBlocks);        

        if (SUCCEEDED(hr))
           hr = image->put_FreeMediaBlocks(freeBlocks);
    }

    // Add a dir to the image
    if (SUCCEEDED(hr))
    {
        hr = root->AddTree(dir, false);
    }

    FreeSysStringAndNull( dir );

    // Create the result image
    if (SUCCEEDED(hr))
    {
        hr = image->CreateResultImage(&fsiresult);
        if (FAILED(hr))
        {
            printf("Failed to get result image, returned %08x\n", hr);
        }
    }

    // Get the stream
    if (SUCCEEDED(hr))
    {
        hr = fsiresult->get_ImageStream(&dataStream);
        if (FAILED(hr))
        {
            printf("Failed to get stream, returned %08x\n", hr);
        }
        else
        {
            printf("Image ready to write\n");
        }
    }

    // write the stream
    if (SUCCEEDED(hr))
    {        
        GetSystemTime(&startTime);
        hr = dataWriter->Write(dataStream);
        GetSystemTime(&endTime);
    }

    if(dataStream)
    {
        dataStream->Release();         
        dataStream = NULL;
    }

    // verify the WriteProtectStatus property gets
    if (SUCCEEDED(hr))
    {
        IMAPI_MEDIA_WRITE_PROTECT_STATE value = 
             (IMAPI_MEDIA_WRITE_PROTECT_STATE)0;

        hr = dataWriter->get_WriteProtectStatus(&value);
    }

    // verify that clearing the disc recorder works
    if (SUCCEEDED(hr))
    {
        hr = dataWriter->put_Recorder(NULL);
    }

    if(image)
    {
        image->Release();         
        image = NULL;
    }

    if(fsiresult)
    {
        fsiresult->Release();         
        fsiresult = NULL;
    }

    if(dataWriter)
    {
        dataWriter->Release();         
        dataWriter = NULL;
    }

    if(discRecorder)
    {
        discRecorder->Release();         
        discRecorder = NULL;
    }

    return hr;
}
Другие вопросы по тегам