Конечно, есть проблема с блокировками на больших файлах.Копание в сети дает следующие кусочки головоломки:
Итак, после всего этого, у меня есть решение: после записи итерируйте корень образа файловой системы и освободите все данные потока.
Существует несколько проблем для мультисессионного диска - поскольку существующие файлы импортируются (с помощью ImportFileSystem), все они проверяются на блокировку, и это может занять некоторое время, и для каждого из них генерируется исключение COMException.не написано в текущей сессии.Приложив немного усилий, я уверен, что разница между файловой системой до и после AddTree может быть кэширована, и проверяются только эти файлы.
Во всяком случае ... После вызова Write мы вызываем ReleaseIFsiItems ...
{
// Write...
// Call to release any locks
ReleaseIFsiItems(fileSystemImage.Root);
// Complete tidy up...
Marshal.FinalReleaseComObject(fileSystem);
Marshal.FinalReleaseComObject(fileSystemImageResult);
}
private static void ReleaseIFsiItems(IFsiDirectoryItem rootItem)
{
if (rootItem == null)
{
return;
}
var enm = rootItem.GetEnumerator();
while (enm.MoveNext())
{
var currentItem = enm.Current as IFsiItem;
var fsiFileItem = currentItem as IFsiFileItem;
if (fsiFileItem != null)
{
try
{
var stream = fsiFileItem.Data;
var iUnknownForObject = Marshal.GetIUnknownForObject(stream);
// Get a reference - things go badly wrong if we release a 0 ref count stream!
var i = Marshal.AddRef(iUnknownForObject);
// Release all references
while (i > 0)
{
i = Marshal.Release(iUnknownForObject);
}
Marshal.FinalReleaseComObject(stream);
}
catch (COMException)
{
// Thrown when accessing fsiFileItem.Data
}
}
else
{
ReleaseIFsiItems(currentItem as IFsiDirectoryItem);
}
}
}
Я надеюсь, что это работает для вас!