///
        /// <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);
                }
            }
        }
Ejemplo n.º 2
0
        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;
        }
Ejemplo n.º 3
0
 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;
 }
     ///
     /// <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);
             }
         }
     }