/// <summary> /// Requested file data. Read the file and write it to ProjFS. /// </summary> public HResult GetFileDataCallback(int commandId, string relativePath, ulong byteOffset, uint length, Guid dataStreamId, byte[] contentId, byte[] providerId, uint triggeringProcessId, string triggeringProcessImageFileName) { var assetPath = GetAssetPath(relativePath); var pakFileSystemInfo = GetSystemInfo(assetPath); if (pakFileSystemInfo == null) { return(HResult.FileNotFound); } uint dataSize = Convert.ToUInt32(pakFileSystemInfo.Size); try { using (IWriteBuffer writeBuffer = virtualizationInstance.CreateWriteBuffer(dataSize)) { var data = ReadFile(assetPath); if (data == null) { return(HResult.FileNotFound); } writeBuffer.Stream.Write(data, 0, data.Length); HResult writeResult = virtualizationInstance.WriteFileData(dataStreamId, writeBuffer, 0, dataSize); return(writeResult); } } catch (OutOfMemoryException) { return(HResult.OutOfMemory); } catch (Exception) { return(HResult.InternalError); } }
public HResult GetFileDataCallback(int commandId, string relativePath, ulong byteOffset, uint length, Guid dataStreamId, byte[] contentId, byte[] providerId, uint triggeringProcessId, string triggeringProcessImageFileName) { if (string.IsNullOrWhiteSpace(relativePath)) { return(HResult.Ok); } else { var fullPath = GetFullPath(relativePath); if (sftpClient.Exists(fullPath)) { var file = sftpClient.Get(fullPath); uint desiredBufferSize = (uint)Math.Min(64 * 1024, file.Length); using (var reader = sftpClient.OpenRead(fullPath)) { using (var writeBuffer = virtualization.CreateWriteBuffer(byteOffset, desiredBufferSize, out var alignedWriteOffset, out var alignedBufferSize)) { while (alignedWriteOffset < (ulong)file.Length) { writeBuffer.Stream.Seek(0, SeekOrigin.Begin); var currentBufferSize = Math.Min(desiredBufferSize, (ulong)file.Length - alignedWriteOffset); var buffer = new byte[currentBufferSize]; reader.Read(buffer, 0, (int)currentBufferSize); writeBuffer.Stream.Write(buffer, 0, (int)currentBufferSize); var hr = virtualization.WriteFileData(dataStreamId, writeBuffer, alignedWriteOffset, (uint)currentBufferSize); if (hr != HResult.Ok) { return(HResult.InternalError); } alignedWriteOffset += (ulong)currentBufferSize; } } } return(HResult.Ok); } else { return(HResult.FileNotFound); } } }