/// /// <summary> /// Constructor of compressed file /// </summary> /// <param name="dataFilePath">path to the data file</param> /// <param name="cipherKey">cipher key (if null, then no encryption is performed)</param> /// <param name="indexFilePath">path to the index file</param> /// <param name="parameters">file parameters</param> /// public CompressedFile(string dataFilePath, string cipherKey, string indexFilePath, FileParameters parameters) : base(dataFilePath, parameters) { indexFile = new OSFile(indexFilePath, parameters); if (cipherKey != null) { setKey(Encoding.Unicode.GetBytes(cipherKey)); } if (!parameters.readOnly) { bitmapExtensionQuantum = (int)(parameters.fileExtensionQuantum >> (ALLOCATION_QUANTUM_LOG + 3)); bitmap = new byte[(int)(base.Length >> (ALLOCATION_QUANTUM_LOG + 3)) + bitmapExtensionQuantum]; bitmapPos = bitmapStart = Page.pageSize >> (ALLOCATION_QUANTUM_LOG + 3); pageMap = new PageMap(); byte[] buf = new byte[8]; for (long indexPos = 0, indexSize = indexFile.Length; indexPos < indexSize; indexPos += 8) { indexFile.Read(indexPos, buf); long pagePos = Bytes.unpack8(buf, 0); long pageBitOffs = pagePos >> (Page.pageSizeLog + ALLOCATION_QUANTUM_LOG); long pageBitSize = ((pagePos & (Page.pageSize - 1)) + ALLOCATION_QUANTUM) >> ALLOCATION_QUANTUM_LOG; Bitmap.reserve(bitmap, pageBitOffs, pageBitSize); } } }
public MultiFile(String filePath, FileParameters parameters) { #if WINRT_NET_FRAMEWORK System.Threading.Tasks.Task<Stream> t = ApplicationData.Current.LocalFolder.OpenStreamForReadAsync(filePath); t.Wait(); StreamReader reader = new StreamReader(t.Result); #else StreamReader reader = new StreamReader(filePath); #endif this.parameters = parameters; segment = new MultiFileSegment[0]; string line; while ((line = reader.ReadLine()) != null) { int sepPos; MultiFileSegment seg = new MultiFileSegment(); string path; if (line.StartsWith("\"")) { sepPos = line.IndexOf('"', 1); path = line.Substring(1, sepPos-1); } else { sepPos = line.IndexOf(' '); path = sepPos < 0 ? line : line.Substring(0, sepPos); } if (sepPos >= 0 && sepPos+1 < line.Length) { String fileLength = line.Substring(sepPos+1).Trim(); if (fileLength.Length > 0) { seg.size = long.Parse(fileLength)*1024; // kilobytes } } fixedSize += seg.size; seg.f = new OSFile(path, parameters); MultiFileSegment[] newSegment = new MultiFileSegment[segment.Length+1]; Array.Copy(segment, 0, newSegment, 0, segment.Length); newSegment[segment.Length] = seg; segment = newSegment; } fixedSize -= segment[segment.Length-1].size; segment[segment.Length-1].size = long.MaxValue; }
public MultiFile(String[] segmentPath, long[] segmentSize, FileParameters parameters) { this.parameters = parameters; segment = new MultiFileSegment[segmentPath.Length]; for (int i = 0; i < segment.Length; i++) { MultiFileSegment seg = new MultiFileSegment(); seg.f = new OSFile(segmentPath[i], parameters); seg.size = segmentSize[i]; fixedSize += seg.size; segment[i] = seg; } fixedSize -= segment[segment.Length-1].size; segment[segment.Length-1].size = long.MaxValue; }