/// <summary> /// Creates the virtual files for the metadata in a XML string form. /// </summary> /// <param name="basePath">The base path.</param> /// <param name="xmlString">The XML string.</param> public static void CreateVirtualFiles(ShadowMetaFullPath basePath, string xmlString) { var metaInfo = XmlUtil.FromXml<DataMetaInfo>(xmlString); var torrent = Torrent.Load(metaInfo.TorrentBytes); if (metaInfo.IsSingleFile) { var virtualFile = new VirtualFile() { PhysicalUri = metaInfo.DataUri, FileSize = torrent.Files[0].Length, OnDemand = metaInfo.OnDemand }; var virtualFilePath = basePath.PathString; Logger.WriteLineIf(LogLevel.Verbose, _log_props, string.Format( "Creating virtual file at {0}", virtualFilePath)); IOUtil.PrepareParentDirForPath(virtualFilePath); XmlUtil.WriteXml<VirtualFile>(virtualFile, virtualFilePath); } else { // Create a virtual file for each TorrentFile. foreach (TorrentFile file in torrent.Files) { var pathUri = new Uri(file.Path, UriKind.Relative); var virtualFile = new VirtualFile() { PhysicalUri = UriUtil.CombineUris(metaInfo.DataUri, pathUri), FileSize = file.Length, OnDemand = metaInfo.OnDemand }; var virtualFilePath = UriUtil.CombinePaths(basePath.PathString, pathUri); Logger.WriteLineIf(LogLevel.Verbose, _log_props, string.Format( "Creating virtual file at {0}", virtualFilePath)); IOUtil.PrepareParentDirForPath(virtualFilePath); XmlUtil.WriteXml<VirtualFile>(virtualFile, virtualFilePath); } } }
public OpenFileInfo(IntPtr fileHandle, VirtualPath virtualPath, VirtualFile virtualFile, FileAccess fileAccess) { _fileHandle = fileHandle; _virtualPath = virtualPath; _virtualFile = virtualFile; _fileAccess = fileAccess; }
/// <summary> /// Creates a virtual file with the Physical location information in it. /// </summary> /// <param name="vp">The vp.</param> VirtualFile CreateAndWriteVirtualFile(VirtualPath vp) { ShadowFullPath readPath = _pathFactory.CreateShadowFullPath4Read(vp); ShadowFullPath writePath = _pathFactory.CreateShadwoFullPath4Write(vp); var virtualFile = new VirtualFile() { PhysicalUri = new Uri(writePath.PathString) }; IOUtil.PrepareParentDirForPath(readPath.PathString); XmlUtil.WriteXml<VirtualFile>(virtualFile, readPath.PathString); Logger.WriteLineIf(LogLevel.Verbose, _log_props, string.Format("A virtual file is created at {0}", readPath.PathString)); return virtualFile; }
/// <summary> /// Reads data given the specified virtual file. /// </summary> /// <param name="virtualFile">The virtual file.</param> /// <param name="buffer">The buffer.</param> /// <param name="offset">The offset.</param> /// <returns>The number of bytes read.</returns> public int Read(VirtualFile virtualFile, byte[] buffer, long offset) { var fileUri = virtualFile.PhysicalUri; if (fileUri.Scheme.Equals("file", StringComparison.OrdinalIgnoreCase)) { // Local disk var filePath = fileUri.LocalPath; Logger.WriteLineIf(LogLevel.Verbose, _log_props, string.Format( "Virtual file points to local path {0}. Reading it...", filePath)); var actualRead = IOUtil.Read(filePath, buffer, offset, buffer.Length); return actualRead; } else { // Other types of services. throw new NotImplementedException(); } }