/// <summary> /// Flushes the stream /// </summary> public override void Flush() { if (fileStream == null) { throw new ObjectDisposedException("fileStream", "storage stream no longer available"); } fileStream.Commit(0); }
public void Commit() { System.Runtime.InteropServices.ComTypes.IStream ppstm = getStream("__properties_version1.0"); IntPtr pm = new IntPtr(); byte[] p = properties.ToArray(); ppstm.Write(p, p.Length, pm); ppstm.Commit(0); strge.Commit(0); properties.Close(); properties = null; }
protected void SetUTF(string key, uint keyValue, string value) { System.Runtime.InteropServices.ComTypes.IStream ppstm = getStream(key); IntPtr pm = new IntPtr(); byte[] p = Encoding.UTF8.GetBytes(value); ppstm.Write(p, p.Length, pm); ppstm.SetSize(p.Length); ppstm.Commit(0); Marshal.ReleaseComObject(ppstm); modifyProperty(keyValue, p.Length + 1); }
public void TransferContentToDevice(string fileName, string parentObjectId) { IPortableDeviceContent content; this._device.Content(out content); IPortableDeviceValues values = GetRequiredPropertiesForContentType(fileName, parentObjectId); PortableDeviceApiLib.IStream tempStream; uint optimalTransferSizeBytes = 0; content.CreateObjectWithPropertiesAndData( values, out tempStream, ref optimalTransferSizeBytes, null); System.Runtime.InteropServices.ComTypes.IStream targetStream = (System.Runtime.InteropServices.ComTypes.IStream)tempStream; try { using (var sourceStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { var buffer = new byte[optimalTransferSizeBytes]; int bytesRead; do { bytesRead = sourceStream.Read( buffer, 0, (int)optimalTransferSizeBytes); IntPtr pcbWritten = IntPtr.Zero; if (bytesRead < (int)optimalTransferSizeBytes) { targetStream.Write(buffer, bytesRead, pcbWritten); } else { targetStream.Write(buffer, (int)optimalTransferSizeBytes, pcbWritten); } /*targetStream.Write( * buffer, (int)optimalTransferSizeBytes, pcbWritten);*/ } while (bytesRead > 0); } targetStream.Commit(0); } finally { Marshal.ReleaseComObject(tempStream); } }
/// <summary> /// 写入数据 /// </summary> /// <param name="sourceFile"></param> /// <param name="portableDevice"></param> /// <param name="parentId"></param> private static void TransferContentToDevice(string sourceFile, PortableDeviceClass portableDevice, string parentId) { IPortableDeviceContent content; portableDevice.Content(out content); IPortableDeviceValues values = GetRequiredPropertiesForContentType(sourceFile, parentId); IStream tempStream; uint optimalTransferSizeBytes = 0; content.CreateObjectWithPropertiesAndData(values, out tempStream, ref optimalTransferSizeBytes, null); System.Runtime.InteropServices.ComTypes.IStream targetStream = (System.Runtime.InteropServices.ComTypes.IStream)tempStream; try { using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read)) { int bytesRead = 0; do { int count = 1024 * 1024; byte[] buffer = new byte[count]; bytesRead = sourceStream.Read(buffer, 0, count); IntPtr pcbWritten = IntPtr.Zero; targetStream.Write(buffer, bytesRead, pcbWritten); }while (bytesRead > 0); } targetStream.Commit(0); } finally { Marshal.ReleaseComObject(tempStream); } }
/// <summary> /// 写入数据 /// </summary> /// <param name="sourceFile"></param> /// <param name="parentId"></param> public bool TransferContentToDevice(string sourceFile, string parentId) { bool bRet = true; IPortableDeviceValues values = GetRequiredPropertiesForContentType(sourceFile, parentId); PortableDeviceApiLib.IStream tempStream = null; uint optimalTransferSize = 0; try { deviceContent.CreateObjectWithPropertiesAndData(values, out tempStream, ref optimalTransferSize, null); System.Runtime.InteropServices.ComTypes.IStream targetStream = (System.Runtime.InteropServices.ComTypes.IStream)tempStream; using (FileStream sourceStream = new FileStream(sourceFile, FileMode.Open, FileAccess.Read)) { int filesize = (int)optimalTransferSize; int bytesRead = 0; IntPtr pcbWritten = IntPtr.Zero; do { byte[] buffer = new byte[filesize]; bytesRead = sourceStream.Read(buffer, 0, filesize); targetStream.Write(buffer, bytesRead, pcbWritten); }while (bytesRead > 0); } targetStream.Commit(0); } catch (Exception) { bRet = false; } finally { Marshal.ReleaseComObject(tempStream); } return(bRet); }
// UPLOAD file public bool UploadFileToWPD(string fileName, string parentObjectId) { bool success = false; IPortableDeviceContent content; this._device.Content(out content); IPortableDeviceValues values = this.GetRequiredPropertiesForContentType(fileName, parentObjectId); PortableDeviceApiLib.IStream tempStream; uint optimalTransferSizeBytes = 0; content.CreateObjectWithPropertiesAndData(values, out tempStream, ref optimalTransferSizeBytes, null); System.Runtime.InteropServices.ComTypes.IStream targetStream = (System.Runtime.InteropServices.ComTypes.IStream)tempStream; try { using (FileStream sourceStream = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { byte[] buffer = new byte[optimalTransferSizeBytes]; int bytesRead; do { bytesRead = sourceStream.Read(buffer, 0, (int)optimalTransferSizeBytes); IntPtr pcbWritten = IntPtr.Zero; if (bytesRead > 0) { targetStream.Write(buffer, bytesRead, pcbWritten); } } while (bytesRead > 0); } targetStream.Commit(0); success = true; } catch { success = false; } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(tempStream); } return(success); }
/** * Copy To Phone */ public void TransferContentToDevice(PortableDeviceFolder parentFolder, string filePath) { PortableDeviceApiLib.IStream tempStream = null; System.Runtime.InteropServices.ComTypes.IStream targetStream = null; try { string fileName = PortableDeviceFolder.last(filePath, "\\"); // Remove existing remote file, if it exists. parentFolder.DeleteFile(this, fileName); // make sure that we are not holding on to a file. DisconnectConnect(); string parentObjectId = parentFolder.Id; IPortableDeviceContent content = getContents(); IPortableDeviceValues values = GetRequiredPropertiesForContentType(filePath, parentObjectId); uint optimalTransferSizeBytes = 0; content.CreateObjectWithPropertiesAndData( values, out tempStream, ref optimalTransferSizeBytes, null); targetStream = (System.Runtime.InteropServices.ComTypes.IStream)tempStream; long length = new System.IO.FileInfo(filePath).Length; long written = 0; long lPCt = 0; using (var sourceStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { var buffer = new byte[optimalTransferSizeBytes]; int bytesRead; do { bytesRead = sourceStream.Read(buffer, 0, (int)optimalTransferSizeBytes); IntPtr PCbWritten = IntPtr.Zero; targetStream.Write(buffer, bytesRead, PCbWritten); written += bytesRead; long PCt = length > 0 ? (100 * written) / length : 100; if (PCt != lPCt) { lPCt = PCt; Console.WriteLine("Progress: " + lPCt); } } while (bytesRead > 0); } targetStream.Commit(0); } catch (Exception ex) { Console.WriteLine(ex.Message); throw ex; } finally { if (null != targetStream) { Marshal.ReleaseComObject(targetStream); } if (null != tempStream) { Marshal.ReleaseComObject(tempStream); } Disconnect(); } }
// COPY inside of the same WPD public bool CopyInsideWPD2(PortableDeviceFile file, string parentObjectId) { bool success = false; // WPD source IPortableDeviceContent contentSrc; this._device.Content(out contentSrc); IPortableDeviceResources resourcesSrc; contentSrc.Transfer(out resourcesSrc); PortableDeviceApiLib.IStream wpdStreamSrc; uint optimalTransferSizeSrc = 0; _tagpropertykey propertySrc = new _tagpropertykey(); propertySrc.fmtid = new Guid(0xE81E79BE, 0x34F0, 0x41BF, 0xB5, 0x3F, 0xF1, 0xA0, 0x6A, 0xE8, 0x78, 0x42); propertySrc.pid = 0; resourcesSrc.GetStream(file.Id, ref propertySrc, 0, ref optimalTransferSizeSrc, out wpdStreamSrc); System.Runtime.InteropServices.ComTypes.IStream streamSrc = (System.Runtime.InteropServices.ComTypes.IStream)wpdStreamSrc; // WPD destination IPortableDeviceContent contentDst; this._device.Content(out contentDst); IPortableDeviceValues values = this.GetRequiredPropertiesForCopyWPD(file, parentObjectId); PortableDeviceApiLib.IStream tempStream; uint optimalTransferSizeBytes = 0; contentDst.CreateObjectWithPropertiesAndData(values, out tempStream, ref optimalTransferSizeBytes, null); System.Runtime.InteropServices.ComTypes.IStream streamDst = (System.Runtime.InteropServices.ComTypes.IStream)tempStream; try { unsafe { byte[] buffer = new byte[1024]; int bytesRead; do { // read from source streamSrc.Read(buffer, 1024, new IntPtr(&bytesRead)); // write to destination IntPtr pcbWritten = IntPtr.Zero; if (bytesRead > 0) { streamDst.Write(buffer, bytesRead, pcbWritten); } } while (bytesRead > 0); } success = true; streamDst.Commit(0); } catch (Exception) { success = false; } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(tempStream); System.Runtime.InteropServices.Marshal.ReleaseComObject(streamSrc); System.Runtime.InteropServices.Marshal.ReleaseComObject(wpdStreamSrc); } return(success); }
public bool CopyFileToDevice(string sourceName, string destinationName, bool deleteOriginal = true) { bool result; PortableDeviceFile file; FileStream fs; PortableDeviceFolder destinationFolder; IStream stream; destinationFolder = this.GetFolder(GetDirectoryNameUnsafe(destinationName)); if (destinationFolder != null) { result = false; fs = new FileStream(sourceName, FileMode.Open, FileAccess.Read); if (fs != null) { if (deleteOriginal == true) { file = GetCachedFile(destinationName) as PortableDeviceFile; if (file == null) { file = GetFile(destinationName); } if (file != null) { DeleteFile(destinationName); } } stream = CreateAndOpenFile(destinationName, fs.Length); if (stream != null) { // IPortableDeviceResources resources; // file.content.Transfer(out resources); destinationFolder.parentDevice.Connect(); //PortableDeviceApiLib.IStream wpdStream; //uint optimalTransferSize = 0; //resources.GetStream(file.Id, ref PortableDeviceConstants.WPD_RESOURCE_DEFAULT, PortableDeviceConstants.STGM_WRITE, ref optimalTransferSize, out wpdStream); _ULARGE_INTEGER c**t; //c**t.QuadPart = (ulong)fs.Length; //stream.SetSize(c**t); System.Runtime.InteropServices.ComTypes.IStream sourceStream = (System.Runtime.InteropServices.ComTypes.IStream)stream; //sourceStream.Commit(0); IntPtr pBytesWritten = Marshal.AllocHGlobal(4); byte[] buffer = new byte[1024]; int bytesRead, bytesWritten; do { bytesRead = fs.Read(buffer, 0, buffer.Length); sourceStream.Write(buffer, bytesRead, pBytesWritten); bytesWritten = Marshal.ReadInt32(pBytesWritten); } while (bytesRead > 0 && bytesWritten > 0); sourceStream.Commit(0); Marshal.FreeHGlobal(pBytesWritten); fs.Close(); destinationFolder.parentDevice.Disconnect(); result = true; } else { throw new Exception("Unable to open file or create destination file"); } } else { throw new Exception("Unable to open source file for reading"); } } else { throw new Exception("Destination folder does not exist"); } return(result); }
internal void CopyToDevice(string source, string destination, bool overwrite) { IPortableDeviceContent content; ComDeviceObject.Content(out content); string parentObjectId = null; FindParentObjectId(Path.GetDirectoryName(destination), ref parentObjectId); if (string.IsNullOrEmpty(parentObjectId)) { throw new Exception("destination folder has not been found."); } IPortableDeviceValues values = GetRequiredPropertiesForContentType(source, destination, parentObjectId); PortableDeviceApiLib.IStream wpdStream = null; uint optimalTransferSize = 0; content.CreateObjectWithPropertiesAndData( values, out wpdStream, ref optimalTransferSize, null); System.Runtime.InteropServices.ComTypes.IStream targetStream = null; try { targetStream = (System.Runtime.InteropServices.ComTypes.IStream)wpdStream; FileStream sourceStream = new FileStream(source, FileMode.Open, FileAccess.Read); unsafe { try { var buffer = new byte[optimalTransferSize]; int bytesRead; do { bytesRead = sourceStream.Read(buffer, 0, (int)optimalTransferSize); IntPtr pcbWritten = IntPtr.Zero; if (bytesRead < (int)optimalTransferSize) { targetStream.Write(buffer, bytesRead, pcbWritten); } else { targetStream.Write(buffer, (int)optimalTransferSize, pcbWritten); } } while (bytesRead > 0); targetStream.Commit(0); } catch (ArgumentException e) { throw new Exception("Some argument has problem, remember this API can't overwrite" + "file on the device side! message: " + e.Message); } finally { sourceStream.Close(); } } } finally { Marshal.ReleaseComObject(wpdStream); Marshal.ReleaseComObject(targetStream); } }