C# FileStream

C# FileStream: .NET हमें ऐसी Classes Provide करता है, जिनका प्रयोग करके हम किसी File को Read अथवा Write भी कर सकते हैं। जबकि Most Common रूप से Use होने वाली Read/Write Device Hard Disk Drive ही होती है। हालांकि हम अन्‍य Devices जैसे कि Printer, Network Connection आदि पर भी समान प्रकार से किसी File को Read/Write कर सकते हैं।

Operating System Level पर सभी Files Byte Oriented होती हैं। अत: Files को Byte Stream का प्रयोग करते हुए Read/Write करना काफी Common होता है। हम किसी Byte Oriented File Stream को किसी Character Based Object में भी Wrap कर सकते हैं। जहां Character Based File Operations तब बहुत उपयोगी होते हैं जब हम Texts के साथ प्रक्रिया कर रहे होते हैं।

किसी File के साथ Attached Byte Oriented Stream को Create करने के लिए हम FileStream Class को Use करते हैं, जिसे Stream Class से ही Derive किया गया है।

C# FileStream – Opening and Closing a File

किसी File के साथ Linked Byte Stream Create करने के लिए हम FileStream Type का Object Create करते हैं। FileStream Type कई Constructors Define करता है। फिर भी सबसे ज्यादा Use किया जाने वाला Constructor निम्नानुसार है:

FileStream(string path, FileMode mode)

यहां path Create होने वाले File Name को Full Path के साथ Represent करता है। जबकि mode Parameter के रूप में हम ये Specify करते हैं कि हम File को किस Mode में Open करना चाहते हैं। यहां हमें FileMode Enum Type में Specified किसी मान को Specify करना होता है, जो कि निम्नानुसार Defined है:

public enum FileMode { CreateNew, Create, Open, OpenOrCreate, Truncate, Append }

सामान्‍यत: ये Constructor हर File को Read/Write Mode में ही Open करता है। लेकिन Exception तब होता है, जब कि File को File.Append Enum Value के साथ Open करते हैं। क्योंकि इस स्थिति में Open होने वाली File Write-Only होती है।

जब हम किसी File को Open करने की कोशिश करते हैं और वह Operation Fail हो जाता है, तो Exception Trigger होता है। यदि Open की जाने वाली File Exist न हो, तो FileNotFoundException Throw होता है। जबकि यदि किसी I/O Error के कारण File Open न हो सके, तो IOException Throw होता है।

जबकि Invalid File Name के कारण ArgumentException, File Name Specify न करने के कारण ArgumentNullException, File को Open करने के लिए पूरा अधिकार न होने के कारण SecurityException, File का Path या File का Name काफी बडा होने के कारण PathTooLongException, Unsupported Device होने पर NotSupportedException, Directory Invalid होने पर DirectoryNotFoundException Fire होता है।

PathTooLongException, DirectoryNotFoundException FileNotFoundException Classes वास्तव में IOException Class की Sub-Classes हैं। इसलिए इन तीनों प्रकार के Exceptions को IOException द्वारा Catch किया जा सकता है।

हालांकि हम FileStream Constructor का प्रयोग करके जो भी Files Open करते हैं, वह Read/Write Mode में होती है। इसलिए यदि हमें किसी File को केवल Reading या केवल Writing Mode में Open करना हो, तो हम FileStream Constructor को निम्नानुसार तरीके से भी Use कर सकते हैं, जिसमें FileAccess Enum Type Value को Specify किया गया हो:

FileStream(string path, FileMode mode, FileAccess access)

path और mode Parameters के बारे में हम पहले ही समझ चुके हैं। FileAccess एक Enum Type है जो किसी File को Read-Only. Write-Only या Read/Write Mode में Open करने का Instruction देता है। इस Enum Type को निम्नानुसार Define किया गया है:

public enum FileAccess { Read, Write, ReadWrite }

अब यदि हम किसी File को FileStream Type Constructor का प्रयोग करते हुए Open करना चाहें, तो निम्नानुसार Statement का प्रयोग कर सकते हैं:

FileStream fInput = new FileStream(“test.dat”, FileMode.Open, FileAccess.ReadWrite)

जब हम किसी File को Open करके Read/Write करने का अपना Operation Perform कर चुके होते हैं, तब हमें उस File के Resources को Free करने के लिए Close() Method को Use करना होता है।

जबकि ये Close() Method Internally, Dispose() Method को Call करके File द्वारा Occupied Resources को Free करता है। हालांकि यदि हम चाहें तो using Statement का प्रयोग करके Open की गई File को Managed तरीके से Close कर सकते हैं, जैसाकि पिछले कुछ उदाहरणों में किया है।

Reading Bytes from FileStream

FileStream Type ReadByte()Read() नाम के दो Methods Define करता है, जिनका प्रयोग किसी Byte Stream से एक Single Character को Read करने के लिए किया जा सकता है। ReadByte() Method, Opened File Stream से हर Character को Read करता है और उसकी Integer Value को Return करता है।

जबकि यदि Control, File के EOF Position पर हो, तो ये Method -1 Return करता है। ये Method NotSupportedException या ObjectDisposedException Return कर सकता है। इसी तरह से File Stream से Bytes के पूरे एक Block को Read करने के लिए हम Read() Method को Use कर सकते हैं। ये Method कुछ निम्नानुसार तरीके से Defined है:

int Read(byte[ ] array, int offset, int count)

इन दोनों Methods का प्रयोग करते हुए हम निम्नानुसार एक Program Create कर सकते हैं, जो Command Line Argument के रूप में उस File का नाम Accept करता है, जिसे हम Open करना चाहते हैं और उस File के Content को Console पर Display करता है:

File Name: ReadingFileStream.cs
using System.IO;
using System;

namespace CSharpFilesAndStreams
{
    class ShowFile
    {
        static void Main(string[] args)
        {
            int i;
            FileStream fin;
            if (args.Length != 1)
            {
                Console.WriteLine("Specify Filename which you want to Open:");
                return;
            }
            try
            {
                fin = new FileStream(args[0], FileMode.Open);
            }
            catch (IOException exc)
            {
                Console.WriteLine("Cannot Open File");
                Console.WriteLine(exc.Message);
                return; // File can't be opened, so stop the program.
            }

            // Read bytes until EOF is encountered.
            try
            {
                do
                {
                    i = fin.ReadByte();
                    if (i != -1) Console.Write((char)i);
                } while (i != -1);
            }
            catch (IOException exc)
            {
                Console.WriteLine("Error Reading File");
                Console.WriteLine(exc.Message);
            }
            finally
            {
                fin.Close();
            }
        }
    }
}

जब हम इस Program को Compile करके Run करते हैं, तो Run करते समय हमें इस Program को एक Command Line Parameter के रूप में उस File का नाम Specify करना होता है, जिसे हम Open करना चाहते हैं। Program Run होते ही सबसे पहले जब निम्न Code Run करता है:

            if (args.Length != 1)
            {
                Console.WriteLine("Specify Filename which you want to Open:");
                return;
            }

तो इसी बात को Check करता है कि हमने Command Line पर किसी File का नाम Specify किया है या नहीं। यदि हमने Open की जाने वाली File का नाम Specify नहीं किया है, तो ये Program हमें निम्नानुसार एक Message देकर Return हो जाता है:

Specify Filename which you want to Open:

लेकिन हम Command Line Parameter के रूप में जो File Name Specify करते हैं, उस नाम की File को Open करने के लिए Program के try Block में निम्न Code लिखा गया है:

            try
            {
                fin = new FileStream(args[0], FileMode.Open);
            }

हमने Command Line Argument के रूप में Specified नाम की File को args[0] से प्राप्त किया है और इसी File को Reading Mode में Open कर रहे हैं। हमने इस File को try Block में इसलिए Specify किया है, क्योंकि यदि Open की जाने वाली File Disk पर Exist न हो, तो FileStream() Constructor एक Exception Throw करेगा, जिसे Catch करना जरूरी है अन्‍यथा Program Crash हो जाएगा।

परिणामस्वरूप यदि Command Line Argument के रूप में Specified नाम की कोई File Disk पर Exist न हो, तो Generate होने वाले Exception को निम्नानुसार Catch करने के लिए एक catch Block Define किया है:

            catch (IOException exc)
            {
                Console.WriteLine("Cannot Open File");
                Console.WriteLine(exc.Message);
                return; // File can't be opened, so stop the program.
            }

लेकिन यदि Command Line Parameter के रूप में Specified Name की File Disk पर Exist हो, तो उस File के Data को Read करने के लिए हमने फिर से एक try Block को निम्नानुसार तरीके से Specify किया है:

            try
            {
                do
                {
                    i = fin.ReadByte();
                    if (i != -1) Console.Write((char)i);
                } while (i != -1);
            }

इस try Block में हमने ReadByte() Method का प्रयोग करते हुए Opened File से हर Character को One by One तब तक Read किया है जब तक कि File का EOF Point प्राप्त नहीं हो जाता। क्योंकि जैसे ही ReadByte() Method को File का EOF Point प्राप्त होता है, ये Method -1 Return करता है।

परिणामस्वरूप उपरोक्त try Block में Specified Loop का End हो जाता है। साथ ही हर Read होने वाले Character को char Type में Cast करके Console पर Write भी करता जाता है। जिससे हमें Console में उस File के सारे Contents दिखाई देने लगते हैं, जिसे Command Line Parameter के रूप में Specify किया था।

साथ ही File Reading के दौरान यदि कोई Exception Generate होता है, तो उसे Handle करने के लिए इसी try Block के Just बाद में निम्नानुसार एक catch Block भी Specify किया है:

            catch (IOException exc)
            {
                Console.WriteLine("Error Reading File");
                Console.WriteLine(exc.Message);
            }

जबकि Normally File Read होने के बाद अथवा किसी भी Exception की स्थिति में File को Close करने के लिए हमने निम्नानुसार एक finally Block भी Create किया है:

            finally
            {
                fin.Close();
            }

इस प्रकार से इस Program का प्रयोग करके हम हमारे Disk पर उपलब्‍ध किसी भी File के Data को Console पर Display कर सकते हैं

Writing Bytes to FileStream

किसी Opened File में Bytes को Write करने के लिए हमें FileStream द्वारा WriteByte() नाम का एक Method प्राप्त होता है, जिसे निम्नानुसार तरीके से Define किया गया है:

void WriteByte(byte value)

इस Method द्वारा value के रूप में Specified Byte को Opened File में Write कर दिया जाता है। जबकि यदि Underlying File Stream Opened न हो, तो ये Method NotSupportedException Throw करता है। जबकि यदि File Closed हो, तो ObjectDisposedException Throw करता है।

यदि हम चाहें तो Bytes का पूरा Array इस Method में Pass करके Write कर सकते हैं। इस स्थिति में हमें Write() Method को Use करना होता है, जिसे निम्नानुसार Define किया गया है:

void Write(byte[ ] array, int offset, int count)

इस Method को Use करने पर array[offset] से शु: करके count में Specified मान के बराबर Bytes को File में Write किया जा सकता है। यदि कोई Error Generate होता है, तो ये Method IOException Throw करता है। जबकि यदि Underlying Stream Open न हो, तो ये Method NotSupportedException Throw करता है।

जब हम Output Perform करते हैं तो Data तुरन्त Actual Physical Device में Write नहीं होता। बल्कि Operating System द्वारा उस Output को एक निश्चित Size तक के Data के Chunk के रूप में Buffer किया जाता है और फिर उस पूरे Chunk of Data को एक ही बार में Disk पर Write किया जाता है। ताकि Disk Writing की Performance को Improve किया जा सके क्योंकि Disk Writing पूरे System का सबसे Slow Process होता है।

उदाहरण के लिए Disk Files Sectors के रूप में Organized रहती हैं, जिसकी सम्भवतया Size 128 Bytes होती है। इसलिए जब हम Write() Method Use करते हुए Hard Disk Drive में Write करना चाहते हैं, तो Operating System Data को तब तक Disk पर Write नहीं करताए जब तक कि Buffer में 128 Bytes Fill न हो जाएें। जब Buffer 128 Bytes के Data से Fill हो जाता है, तभी Operating System Data को Disk पर Write करता है।

इसलिए हम Flush() Method को Use करके अपने Program के दौरान कभी भी Data को Disk पर Physically Write करने के Operating System को Instruct कर सकते हैं। ये Method भी IOException व ObjectDisposedException Throw कर सकता है।

जबकि File के साथ विभिन्न Operations Perform करने के बाद इसे Close() करने के लिए हम Close() Method को Use कर सकते हैं, ताकि File द्वारा Occupied Resources को Free किया जा सके। साथ ही जब हम Close() Method को Use करते हैं, तो Operating System Automatically Buffer में Stored सभी Characters को Disk पर Write कर देता है, भले ही उस स्थिति में Buffer में केवल एक ही Character क्यों न हो।

Write() Method को Use करते हुए हम निम्नानुसार एक Program Create कर सकते हैं, जो test.txt नाम की एक File Open करता है और उसमें Alphabets को Write करता है:

File Name: WritingFileStream.cs
using System.IO;
using System;

namespace CSharpFilesAndStreams
{
    class WriteToFile
    {
        static void Main(string[] args)
        {
            FileStream fout = null;
            try
            {
                // Open output file.
                fout = new FileStream("test.txt", FileMode.CreateNew);

                // Write the alphabet to the file.
                for (char c = 'A'; c <= 'Z'; c++)
                    fout.WriteByte((byte)c);
            }
            catch (IOException exc)
            {
                Console.WriteLine("I/O Error:\n" + exc.Message);
            }
            finally
            {
                if (fout != null) fout.Close();
            }
        }
    }
}

जब ये Program Run होता है तो try Block में Specified निम्न Statement के माध्‍यम से test.txt नाम की एक File Create करता है:

fout = new FileStream(“test.txt”, FileMode.CreateNew);

और निम्न Loop द्वारा उस File में WriteByte() Method के माध्‍यम से Alphabets को Write करता है:

            catch (IOException exc)
            {
                Console.WriteLine("I/O Error:\n" + exc.Message);
            }

जबकि यदि test.txt नाम की File Disk पर पहले से Exist हो, तो ये Method एक Exception Throw करता है, जिसे catch Block में निम्नानुसार Code द्वारा Catch किया जाता है:

            catch (IOException exc)
            {
                Console.WriteLine("I/O Error:\n" + exc.Message);
            }

और Output में निम्नानुसार “File Already Exists” का Message Display होता है:

I/O Error:
The file ‘E:\CSPrograms\CSharp-Files-Streams\test.txt’ already exists.

जबकि File Normal तरीके से Create हो या Exception Generate हो, दोनों ही स्थितियों में निम्नानुसार finally Statement Run होता है:

            finally
            {
                if (fout != null) fout.Close();
            }

और उस स्थिति में File को Close कर देता है, जबकि वह Opened हो। यदि File Opened न हो, तो ये Block कुछ नहीं करता।

FileStream Type के Byte Oriented I/O का मुख्‍य फायदा ये है कि हम इसका प्रयोग न केवल Textual Data Files के साथ Operation Perform करने के लिए कर सकते हैं, बल्कि Binary Files जैसे कि .EXE या .DLL Type की Files के साथ प्रक्रिया करने के लिए भी इसे Use किया जा सकता है।

इसे समझने के लिए हम निम्नानुसार एक File Copy Program Create कर सकते हैं, जो कि Command Prompt पर Parameter के रूप में Source व Target के रूप में दो Files के नाम Accept करता है और Source File के Content को Target File में Copy कर देता है:

File Name: FileCopyProgram.cs
using System.IO;
using System;

namespace CSharpFilesAndStreams
{
    class CopyFile
    {
        static void Main(string[] args)
        {
            int i;
            FileStream fin = null;
            FileStream fout = null;
            if (args.Length != 2)
            {
                Console.WriteLine("Usage: CopyFile From To");
                return;
            }
            try
            {
                // Open the files.
                fin = new FileStream(args[0], FileMode.Open);
                fout = new FileStream(args[1], FileMode.Create);
                // Copy the file.
                do
                {
                    i = fin.ReadByte();
                    if (i != -1) fout.WriteByte((byte)i);
                } while (i != -1);
            }
            catch (IOException exc)
            {
                Console.WriteLine("I/O Error:\n" + exc.Message);
            }
            finally
            {
                if (fin != null) fin.Close();
                if (fout != null) fout.Close();
            }
        }
    }
}

ये Program एक File को Reading Mode में Open करता है और दूसरी File को Writing Mode में। फिर Reading File से एक-एक Byte के Data को ReadByte() Method का प्रयोग करके Read करता है और WriteByte() Method का प्रयोग करके क्रम से Target File में Write करता है। इस तरह से इस Program का प्रयोग Source File के Content को Target File में Copy करने के लिए किया जा सकता है।

C# Console.WriteLine | C# Console.ReadLine
C# StreamWriter | C# StreamReader

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW GET DEMO REVIEWS

MidRangeHub Finance Auto Loans Bank Business Health Insurance Insurance Investment Law Lif Insurance Loan Stocks how to endorse a check chase sapphire travel insurance chase sapphire travel delay when are property taxes due Tower Loans how to sell stocks on cash app Voided Check Examples Personal Finance Books Collateral Loans how to sell stocks on cashapp how do you sell your stocks on cash app how to sell stock on cash app joint account sofi joint account ally joint account capital one joint account best bank for joint account chase joint account cyber insurance coverage silverfort free cyber insurance coverage silverfort monjouro savings card Money6x Real Estate