Exemplo n.º 1
0
        /// <summary>
        /// liefert die aktuellen Dateidaten (über den <see cref="BinaryReaderWriter"/> des Dateisystems oder aus der Backup-Datei)
        /// <para>Wegen der Funktion Stream.Read() darf die internen Datei nicht größer als 0x3FFFFFFF (2 GB) sein.</para>
        /// <para>Wenn der IMG-BinaryReaderWriter geliefert wird, werden die Datei-Daten in einen neuen Speicherbereich kopiert und dieser geliefert.</para>
        /// </summary>
        /// <param name="file"></param>
        /// <param name="br"></param>
        /// <returns></returns>
        protected byte[] getFiledata(FileProps file, BinaryReaderWriter br)
        {
            if (br == null ||
                preblocks4read < 0 ||
                File.Exists(file.Backgroundfile))
            {
                if (File.Exists(file.Backgroundfile))
                {
                    return(File.ReadAllBytes(file.Backgroundfile));
                }
                // dann ex. noch keine Daten
                return(new byte[0]);
            }
            else
            {
                if (br != null &&
                    preblocks4read > 0)                        // aus dem Originalstream Daten einlesen
                {
                    byte[]   data   = new byte[file.Filesize]; // neuer Speicherbereich
                    UInt16[] blocks = file.PseudoFileBlocks();

                    for (int i = 0; i < blocks.Length; i++)
                    {
                        int offset = ImgHeader.FileBlockLength * i;
                        br.Seek(ImgHeader.FileBlockLength * (long)(preblocks4read + blocks[i]));
                        br.BaseStream.Read(data,
                                           offset,
                                           file.Filesize - offset >= ImgHeader.FileBlockLength ? ImgHeader.FileBlockLength : (int)file.Filesize - offset);
                    }

                    return(data);
                }
            }
            return(null);
        }