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;
}