FileRegion.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / WCF / Log / System / IO / Log / FileRegion.cs / 1305376 / FileRegion.cs

                            //------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IO.Log
{ 
    using System;
    using System.Diagnostics; 
    using System.IO; 

    public sealed class FileRegion 
    {
        long fileLength;
        string path;
        long offset; 
        long length;
        byte[] fixedContent; 
 
        internal FileRegion(long fileLength,
                            string path, 
                            long offset,
                            long length)
        {
            this.fileLength = fileLength; 
            this.path = path;
            this.offset = offset; 
            this.length = length; 
        }
 
        internal FileRegion(long fileLength,
                            string path,
                            long offset,
                            byte[] fixedContent) 
        {
            this.fileLength = fileLength; 
            this.path = path; 
            this.offset = offset;
            this.length = fixedContent.LongLength; 
            this.fixedContent = fixedContent;
        }

        public long FileLength 
        {
            get 
            { 
                return this.fileLength;
            } 
        }

        public long Offset
        { 
            get
            { 
                return this.offset; 
            }
        } 

        public string Path
        {
            get 
            {
                return this.path; 
            } 
        }
 
        public Stream GetStream()
        {
            if (this.fixedContent != null)
            { 
                return new MemoryStream(this.fixedContent,
                                        0, 
                                        this.fixedContent.Length, 
                                        false,
                                        false); 
            }
            else
            {
                Stream innerStream = new FileStream(this.path, 
                                                    FileMode.Open,
                                                    FileAccess.Read, 
                                                    FileShare.ReadWrite); 
                return new Substream(innerStream,
                                     this.offset, 
                                     this.length);
            }
        }
 
        class Substream : Stream
        { 
            Stream innerStream; 
            long offset;
            long length; 

            internal Substream(Stream innerStream,
                               long offset,
                               long length) 
            {
                this.innerStream = innerStream; 
                this.offset = offset; 
                this.length = length;
            } 

            public override bool CanRead  { get { return true; } }
            public override bool CanSeek  { get { return true; } }
            public override bool CanWrite { get { return false; } } 

            public override long Length 
            { 
                get
                { 
                    return this.length;
                }
            }
 
            public override long Position
            { 
                get 
                {
                    return this.innerStream.Position - this.offset; 
                }

                set
                { 
                    this.innerStream.Position = value + this.offset;
                } 
            } 

            public override void Close() 
            {
                this.innerStream.Close();
                base.Close();
            } 

            public override void Flush() 
            { 
                this.innerStream.Flush();
            } 

            public override int Read(byte[] buffer, int offset, int count)
            {
                // Truncate read if it goes past the length of the 
                // stream...
                // 
                if (this.Length - this.Position < count) 
                {
                    count = checked((int)(this.Length - this.Position)); 
                    if (count < 0)
                        return 0;
                }
 
                return this.innerStream.Read(buffer,
                                             offset, 
                                             count); 
            }
 
            public override long Seek(long offset, SeekOrigin origin)
            {
                if (origin == SeekOrigin.Begin)
                { 
                    offset += this.offset;
                } 
                else if (origin == SeekOrigin.End) 
                {
                    offset = this.offset + this.length - offset; 
                    origin = SeekOrigin.Begin;
                }

                return this.innerStream.Seek(offset, origin); 
            }
 
            public override void SetLength(long value) 
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported()); 
            }

            public override void Write(byte[] buffer, int offset, int count)
            { 
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported());
            } 
 
            public override void WriteByte(byte value)
            { 
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported());
            }
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//------------------------------------------------------------------------------ 
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
namespace System.IO.Log
{ 
    using System;
    using System.Diagnostics; 
    using System.IO; 

    public sealed class FileRegion 
    {
        long fileLength;
        string path;
        long offset; 
        long length;
        byte[] fixedContent; 
 
        internal FileRegion(long fileLength,
                            string path, 
                            long offset,
                            long length)
        {
            this.fileLength = fileLength; 
            this.path = path;
            this.offset = offset; 
            this.length = length; 
        }
 
        internal FileRegion(long fileLength,
                            string path,
                            long offset,
                            byte[] fixedContent) 
        {
            this.fileLength = fileLength; 
            this.path = path; 
            this.offset = offset;
            this.length = fixedContent.LongLength; 
            this.fixedContent = fixedContent;
        }

        public long FileLength 
        {
            get 
            { 
                return this.fileLength;
            } 
        }

        public long Offset
        { 
            get
            { 
                return this.offset; 
            }
        } 

        public string Path
        {
            get 
            {
                return this.path; 
            } 
        }
 
        public Stream GetStream()
        {
            if (this.fixedContent != null)
            { 
                return new MemoryStream(this.fixedContent,
                                        0, 
                                        this.fixedContent.Length, 
                                        false,
                                        false); 
            }
            else
            {
                Stream innerStream = new FileStream(this.path, 
                                                    FileMode.Open,
                                                    FileAccess.Read, 
                                                    FileShare.ReadWrite); 
                return new Substream(innerStream,
                                     this.offset, 
                                     this.length);
            }
        }
 
        class Substream : Stream
        { 
            Stream innerStream; 
            long offset;
            long length; 

            internal Substream(Stream innerStream,
                               long offset,
                               long length) 
            {
                this.innerStream = innerStream; 
                this.offset = offset; 
                this.length = length;
            } 

            public override bool CanRead  { get { return true; } }
            public override bool CanSeek  { get { return true; } }
            public override bool CanWrite { get { return false; } } 

            public override long Length 
            { 
                get
                { 
                    return this.length;
                }
            }
 
            public override long Position
            { 
                get 
                {
                    return this.innerStream.Position - this.offset; 
                }

                set
                { 
                    this.innerStream.Position = value + this.offset;
                } 
            } 

            public override void Close() 
            {
                this.innerStream.Close();
                base.Close();
            } 

            public override void Flush() 
            { 
                this.innerStream.Flush();
            } 

            public override int Read(byte[] buffer, int offset, int count)
            {
                // Truncate read if it goes past the length of the 
                // stream...
                // 
                if (this.Length - this.Position < count) 
                {
                    count = checked((int)(this.Length - this.Position)); 
                    if (count < 0)
                        return 0;
                }
 
                return this.innerStream.Read(buffer,
                                             offset, 
                                             count); 
            }
 
            public override long Seek(long offset, SeekOrigin origin)
            {
                if (origin == SeekOrigin.Begin)
                { 
                    offset += this.offset;
                } 
                else if (origin == SeekOrigin.End) 
                {
                    offset = this.offset + this.length - offset; 
                    origin = SeekOrigin.Begin;
                }

                return this.innerStream.Seek(offset, origin); 
            }
 
            public override void SetLength(long value) 
            {
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported()); 
            }

            public override void Write(byte[] buffer, int offset, int count)
            { 
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported());
            } 
 
            public override void WriteByte(byte value)
            { 
                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(Error.NotSupported());
            }
        }
    } 
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK