ප්‍රවාහයකින් බයිට් අරා නිර්මාණය කිරීම


929

ආදාන ප්‍රවාහයකින් බයිට් අරා නිර්මාණය කිරීම සඳහා වඩාත් සුදුසු ක්‍රමය කුමක්ද?

.NET 3.5 සමඟ මගේ වර්තමාන විසඳුම මෙන්න.

Stream s;
byte[] b;

using (BinaryReader br = new BinaryReader(s))
{
    b = br.ReadBytes((int)s.Length);
}

ඇළේ කුට්ටි කියවීම හා ලිවීම තවමත් වඩා හොඳ අදහසක් ද?


61
ඇත්ත වශයෙන්ම, තවත් ප්‍රශ්නයක් නම් ඔබ ප්‍රවාහයකින් බයිට් එකක් සෑදිය යුතුද යන්නයි ... විශාල දත්ත සඳහා, ධාරාව ප්‍රවාහයක් ලෙස සැලකීම වඩාත් සුදුසුය!
මාක් ග්‍රෙවෙල්

2
ඇත්ත වශයෙන්ම ඔබ බොහෝ විට බයිට් වෙනුවට ප්‍රවාහයක් භාවිතා කළ යුතුය []. නමුත් ධාරාවන්ට සහය නොදක්වන සමහර පද්ධති ඒපීඅයි ඇත. උදාහරණයක් ලෙස, ඔබට ධාරාවකින් X509Certificate2 නිර්මාණය කළ නොහැක , ඔබට එයට බයිට් එකක් [හෝ නූලක්) දිය යුතුය. X509 සහතිකයක් බොහෝ විට විශාල දත්ත නොවන බැවින් මෙම අවස්ථාවේ දී එය හොඳයි .
0xced

Answers:


1312

එය සැබවින්ම රඳා පවතින්නේ ඔබට විශ්වාස කළ හැකිද නැද්ද යන්න මතය s.Length. බොහෝ ධාරාවන් සඳහා, කොපමණ දත්ත ප්‍රමාණයක් පවතිනු ඇත්දැයි ඔබ නොදනී. එවැනි අවස්ථාවන්හිදී - සහ .NET 4 ට පෙර - මම මේ වගේ කේත භාවිතා කරමි:

public static byte[] ReadFully(Stream input)
{
    byte[] buffer = new byte[16*1024];
    using (MemoryStream ms = new MemoryStream())
    {
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            ms.Write(buffer, 0, read);
        }
        return ms.ToArray();
    }
}

.NET 4 සහ ඊට ඉහළින්, මම භාවිතා කරමි Stream.CopyTo, එය මූලික වශයෙන් මගේ කේතයේ ඇති ලූපයට සමාන වේ - නිර්මාණය කරන්න MemoryStream, අමතන්න stream.CopyTo(ms)සහ ආපසු යන්න ms.ToArray(). වැඩේ ඉවරයි.

මගේ පිළිතුර අනෙක් අයට වඩා දිගු වන්නේ මන්දැයි මම සමහර විට පැහැදිලි කළ යුතුය. Stream.Readඑය ඉල්ලා සිටින සෑම දෙයක්ම කියවන බවට සහතික නොවේ. ඔබ ජාල ප්‍රවාහයකින් කියවන්නේ නම්, උදාහරණයක් ලෙස, එය එක් පැකට්ටුවක වටිනාකම කියවා නැවත දත්ත ලබා ගත හැකි වුවද නැවත පැමිණේ. BinaryReader.Readධාරාවේ අවසානය හෝ ඔබේ නිශ්චිත ප්‍රමාණය දක්වා දිගටම පවතිනු ඇත, නමුත් ආරම්භ කිරීමට අවශ්‍ය ප්‍රමාණය ඔබ තවමත් දැන සිටිය යුතුය.

ඉහත ක්‍රමය MemoryStreamදත්ත වලින් ඉවතට යන තෙක් කියවීම (සහ අ වෙත පිටපත් කිරීම ) දිගටම කරගෙන යනු ඇත . ඉන්පසු එය MemoryStreamදත්තවල පිටපතක් අරාවකින් ආපසු ලබා දෙන ලෙස ඉල්ලා සිටී . ආරම්භ කළ යුතු ප්‍රමාණය ඔබ දන්නේ නම් - හෝ ඔබ නොදැනුවත්වම ප්‍රමාණය දන්නවා යැයි සිතන්නේ නම් - ඔබට MemoryStreamආරම්භ කිරීමට අවශ්‍ය ප්‍රමාණය සෑදිය හැකිය. එලෙසම ඔබට අවසානයේ චෙක්පතක් තැබිය හැකි අතර, ධාරාවේ දිග බෆරයට සමාන ප්‍රමාණයක් නම් (ආපසු එවනු ලැබේ MemoryStream.GetBuffer) එවිට ඔබට බෆරය ආපසු ලබා දිය හැකිය. එබැවින් ඉහත කේතය තරමක් ප්‍රශස්ත නොවේ, නමුත් අවම වශයෙන් නිවැරදි වනු ඇත. ධාරාව වැසීම සඳහා එය කිසිදු වගකීමක් භාර නොගනී - අමතන්නා එය කළ යුතුය.

වැඩි විස්තර සඳහා මෙම ලිපිය බලන්න (සහ විකල්ප ක්‍රියාත්මක කිරීමක්).


9
On ජෝන්, yoda.arachsys.com/csharp/readbinary.html ගැන සඳහන් කිරීම වටී
සෑම් කුංකුම

6
E ජෙෆ්: අපට ඇත්ත වශයෙන්ම මෙහි සන්දර්භය නොමැත, නමුත් ඔබ ප්‍රවාහයකට ලියන්නේ නම්, ඔව්, කියවීමට පෙර ඔබ එය "පෙරළා" දැමිය යුතුය. ඔබ ධාරාව තුළ සිටින්නේ කොහේදැයි කියන්නේ එක් "කර්සරයක්" පමණි - කියවීමට එකක් සහ ලිවීමට වෙනම එකක් නොවේ.
ජෝන් ස්කීට්

5
E ජෙෆ්: එය අමතන්නාගේ වගකීමයි. සියල්ලට පසු, ධාරාව සෙවිය නොහැකි විය හැකිය (උදා: ජාල ප්‍රවාහයක්) හෝ එය නැවත පෙරළීමේ අවශ්‍යතාවයක් නොමැති විය හැකිය.
ජෝන් ස්කීට්

18
ඇයිදැයි මට විමසිය හැකිද 16*1024?
Anyname Donotcare

5
@just_name: මම දන්නේ නැහැ මේ කිසිදු වැදගත්කමක් නම්, නමුත් (16 * 1024) Int16.MaxValue අඩක් විය සිදු :)
caesay

747

ජෝන් ගේ පිළිතුර නිවැරදි වුවත්, ඔහු දැනටමත් පවතින කේතය නැවත ලියයි CopyTo. .Net 4 සඳහා සැන්ඩිප්ගේ විසඳුම භාවිතා කරන්න, නමුත් .Net හි පෙර අනුවාදය සඳහා ජෝන් ගේ පිළිතුර භාවිතා කරන්න. CopyToබොහෝ අවස්ථාවන්හි දී ව්‍යතිරේකයන් බොහෝ දුරට ඉඩ ඇති බැවින් "භාවිතා කිරීම" භාවිතා කිරීමෙන් සැන්ඩිප්ගේ කේතය වැඩිදියුණු වනු ඇත MemoryStream.

public static byte[] ReadFully(Stream input)
{
    using (MemoryStream ms = new MemoryStream())
    {
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

6
ඔබේ පිළිතුර සහ ජෝන් ගේ පිළිතුර අතර ඇති වෙනස කුමක්ද? එසේම මම මෙම ආදානය කළ යුතුය. CopyTo වැඩ කිරීමට ස්ථානය = 0.
ජෙෆ්

1
athan නාතන්, වෙබ් සේවාදායකයා වෙතින් ගොනුවක් කියවන්න (filizesize = 1mb) - iis හට මුළු 1mb එහි මතකයට පැටවීමට සිදුවේද?
රෝයි නමීර්

5
E ජෙෆ්, මගේ පිළිතුර ක්‍රියාත්මක වන්නේ .නෙට් 4 හෝ ඊට ඉහළින් පමණි, ජෝන්ස් පසු සංස්කරණයේ දී අපට ලබා දී ඇති ක්‍රියාකාරිත්වය නැවත ලිවීමෙන් පහළ අනුවාදයන් මත ක්‍රියා කරනු ඇත. පිටපත් කිරීම වත්මන් ස්ථානයෙන් පමණක් පිටපත් වන බව ඔබ නිවැරදියි, ඔබට සෙවිය හැකි ප්‍රවාහයක් තිබේ නම් සහ ඔබට මුල සිටම පිටපත් කිරීමට අවශ්‍ය නම් ඔබේ කේතය හෝ ආදානය භාවිතයෙන් ආරම්භයට යා හැකිය. බලන්න (0, සීක් ඔරිජින්.බිගින්), බොහෝ අවස්ථාවලදී ඔබේ ප්‍රවාහය සෙවිය නොහැකි විය හැකිය.
නේතන් ෆිලිප්ස්

5
inputදැනටමත් MemorySteamකෙටි හා කෙටි පරිපථයක් තිබේදැයි පරීක්ෂා කිරීම වටී . මම දන්නවා ඇමතුම ලබා ගැනීම මෝඩකමක් බව MemoryStreamනමුත් ...
ජොඩ්රෙල්

3
Od ජොඩ්රෙල්, හරියටම එසේ ය. ඔයා තමයි මතකය කුඩා ඇළ මිලියන පිටපත් හා ඔවුන් එක් වන්නේ නම් MemoryStreamඑවිට ප්රශස්තිකරණය ඔබගේ සන්දර්භය තුළ තේරුමක් දැයි බව, එක් කාර්යය පිටපත් කිරීමට ගතවන කාලය එරෙහිව වර්ගය පරිවර්ථනයන් මිලියන ඉටු කිරීමට ගන්නා කාලය වන සංසන්දනය MemoryStreamබවට තවත් එකක් MemoryStream.
නේතන් ෆිලිප්ස්

116

ඔබට දැනටමත් ඇති මතක ධාරාවක් තිබේ නම් පෙන්වා දීමට අවශ්‍යය memorystream.ToArray() සඳහා .

එසේම, ඔබ නොදන්නා හෝ වෙනස් උප ප්‍රභේද සමඟ ගනුදෙනු කරන්නේ නම් සහ ඔබට එය ලැබිය හැකි නම් MemoryStream, ඔබට එම අවස්ථා සඳහා එම ක්‍රමවේදය මත රිලීස් කළ හැකි අතර අනෙක් අය සඳහා පිළිගත් පිළිතුර තවමත් භාවිතා කරන්න:

public static byte[] StreamToByteArray(Stream stream)
{
    if (stream is MemoryStream)
    {
        return ((MemoryStream)stream).ToArray();                
    }
    else
    {
        // Jon Skeet's accepted answer 
        return ReadFully(stream);
    }
}

1
හහ්, සියලු උඩු යටිකුරු කිරීම් මොනවාද? වඩාත්ම ත්යාගශීලී උපකල්පන සමඟ වුවද, මෙය ක්රියාත්මක වන්නේ දැනටමත් ඇති ධාරාවන් සඳහා පමණි MemoryStream. ඇත්ත වශයෙන්ම උදාහරණය පැහැදිලිවම අසම්පූර්ණයි, එය ආරම්භක නොවන විචල්‍යයක් භාවිතා කරන ආකාරය තුළ.
රෝමන් ස්ටාර්කොව්

3
එය හරි, එය පෙන්වා දීමට ස්තූතියි. කාරණය තවමත් MemoryStream සඳහා යොමු වී ඇත, එබැවින් එය පිළිබිඹු කිරීම සඳහා මම එය සවි කළෙමි.
ප්‍රනාන්දු නීරා

MemoryStream සඳහා තවත් හැකියාවක් MemoryStream.GetBuffer () බව සඳහන් කරන්න, නමුත් සමහර ගොචා සම්බන්ධ වී ඇත. Stackoverflow.com/questions/1646193/… සහ krishnabhargav.blogspot.dk/2009/06/…
RenniePet

4
මෙය සැබවින්ම ස්කීට් කේතයට දෝෂයක් හඳුන්වා දෙයි; ඔබ stream.Seek(1L, SeekOrigin.Begin)අමතන්නේ නම්, ඔබ කියවීමට පෙර, ධාරාව මතක ප්‍රවාහයක් නම්, එය වෙනත් ප්‍රවාහයකට වඩා බයිට් 1 ක් ඔබට ලැබෙනු ඇත. මෙම දුරකථන ඇමතුම වර්තමාන තත්ත්වය කොහෙද සිට ඇළ, අවසානය දක්වා කියවීමට අපේක්ෂා නම්, ඔබ භාවිතා නොකළ යුතුය CopyToහෝ ToArray(); බොහෝ අවස්ථාවන්හීදී මෙය ගැටළුවක් නොවනු ඇත, නමුත් අමතන්නා මෙම විචක්ෂණශීලී හැසිරීම ගැන නොදන්නේ නම් ඔවුන් ව්‍යාකූල වනු ඇත.
ලීට් කරන්න


52

මගේ යුවළගේ ශත ... මම බොහෝ විට භාවිතා කරන පුරුද්ද වන්නේ අභිරුචි සහායකයකු ලෙස මෙවැනි ක්‍රම සංවිධානය කිරීමයි

public static class StreamHelpers
{
    public static byte[] ReadFully(this Stream input)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            input.CopyTo(ms);
            return ms.ToArray();
        }
    }
}

වින්‍යාස ගොනුවට නාම අවකාශයක් එක් කර ඔබට අවශ්‍ය ඕනෑම තැනක එය භාවිතා කරන්න


5
4.0 CopyToවන Streamතෙක් නොතිබූ පරිදි මෙය .NET 3.5 සහ ඊට පහළින් ක්‍රියා නොකරන බව සලකන්න .
ටිම්

16

ඔබට හුදෙක් මතකය ප්‍රවාහ පන්තියේ ToArray () ක්‍රමය භාවිතා කළ හැකිය.

MemoryStream ms = (MemoryStream)dataInStream;
byte[] imageBytes = ms.ToArray();

10

ඔබට එය දිගුවන් සමඟ විනෝදකාමී බවට පත් කළ හැකිය:

namespace Foo
{
    public static class Extensions
    {
        public static byte[] ToByteArray(this Stream stream)
        {
            using (stream)
            {
                using (MemoryStream memStream = new MemoryStream())
                {
                     stream.CopyTo(memStream);
                     return memStream.ToArray();
                }
            }
        }
    }
}

ඉන්පසු එය සාමාන්‍ය ක්‍රමයක් ලෙස අමතන්න:

byte[] arr = someStream.ToByteArray()

68
ආදාන ප්‍රවාහය භාවිතා කරන කොටසකට දැමීම නරක අදහසක් යැයි මම සිතමි. එම වගකීම ඇමතීමේ ක්‍රියා පටිපාටිය මත රඳා පවතී.
ජෙෆ්

7

මට බොබ්ගේ (එනම් ප්‍රශ්න කරන්නාගේ) කේතය සමඟ සංයුක්ත කාල දෝෂයක් ලැබේ. Stream.Length යනු දිගු වන අතර BinaryReader.ReadBytes පූර්ණ සංඛ්‍යා පරාමිතියක් ගනී. මගේ නඩුවේදී, දිගු නිරවද්‍යතාවයක් අවශ්‍ය තරම් විශාල ධාරාවන් සමඟ කටයුතු කිරීමට මම අපේක්ෂා නොකරමි, එබැවින් මම පහත සඳහන් දෑ භාවිතා කරමි:

Stream s;
byte[] b;

if (s.Length > int.MaxValue) {
  throw new Exception("This stream is larger than the conversion algorithm can currently handle.");
}

using (var br = new BinaryReader(s)) {
  b = br.ReadBytes((int)s.Length);
}

5

යමෙක් එයට කැමති නම්, මෙහි .NET 4+ එකම විසඳුමක් වන්නේ මතකය ප්‍රවාහයට අනවශ්‍ය ලෙස බැහැර කිරීමේ ඇමතුමකින් තොරව දිගු කිරීමේ ක්‍රමයක් ලෙසය. මෙය බලාපොරොත්තු රහිතව සුළු සුළු ප්‍රශස්තිකරණයකි, නමුත් මතක ප්‍රවාහයක් බැහැර කිරීමට අපොහොසත් වීම සැබෑ අසාර්ථකත්වයක් නොවන බව සඳහන් කිරීම වටී.

public static class StreamHelpers
{
    public static byte[] ReadFully(this Stream input)
    {
        var ms = new MemoryStream();
        input.CopyTo(ms);
        return ms.ToArray();
    }
}

3

ඉහත සඳහන් දෙය හරි ... නමුත් ඔබ SMTP හරහා දේවල් යවන විට දත්ත දූෂණයට මුහුණ දෙනු ඇත (ඔබට අවශ්‍ය නම්). බයිට් සඳහා නිවැරදිව බයිට් යැවීමට උපකාරී වන වෙනත් දෙයකට මම වෙනස් කර ඇත: '

using System;
using System.IO;

        private static byte[] ReadFully(string input)
        {
            FileStream sourceFile = new FileStream(input, FileMode.Open); //Open streamer
            BinaryReader binReader = new BinaryReader(sourceFile);
            byte[] output = new byte[sourceFile.Length]; //create byte array of size file
            for (long i = 0; i < sourceFile.Length; i++)
                output[i] = binReader.ReadByte(); //read until done
            sourceFile.Close(); //dispose streamer
            binReader.Close(); //dispose reader
            return output;
        }'

මෙම කේතය දත්ත දූෂණය වළක්වන්නේ කොහෙන්දැයි මට නොපෙනේ. ඔබට එය පැහැදිලි කළ හැකිද?
නිප්පි

ඔබට පින්තූරයක් ඇති බවත් එය SMTP හරහා යැවීමට අවශ්‍ය බවත් කියමු. ඔබ බොහෝ විට base64 කේතන ක්‍රමයක් භාවිතා කරනු ඇත. කිසියම් හේතුවක් නිසා, ඔබ එය බයිට් ලෙස කැඩී ගියහොත් ගොනුව දූෂිත වේ. කෙසේ වෙතත්, ද්විමය කියවනය භාවිතා කිරීමෙන් ගොනුව සාර්ථකව යැවීමට ඉඩ දෙනු ඇත.
නොටින් රැන්ඩම්

3
තරමක් පැරණි, නමුත් මට හැඟී ගියේ මෙය සඳහන් වන බවයි - othNothinRandom ක්‍රියාත්මක කිරීම මඟින් ධාරාවන් නොව නූල් සමඟ ක්‍රියා කරයි. File.ReadAllBytes භාවිතා කිරීම සරලවම විය හැකිය.
XwipeoutX

1
භයානක කේත ශෛලිය නිසා පහත් කොට සලකන්න (ස්වයංක්‍රීයව බැහැර කිරීම / භාවිතා කිරීම නොමැත).
arni

කනගාටුවට කරුණක් නම් -1 පමණක් අවසර දී ඇති අතර, ප්‍රශ්නයට කිසිදු සම්බන්ධයක් නැත, ආදාන නම් කළ ගොනු නාම පරාමිතිය, බැහැර නොකිරීම, කියවීමේ බෆරයක්, ගොනු මාදිලියක් සහ ද්විමය පා er කයාට බයිට් වලින් බයිට් කියවීමට ඇයි?
ඇරිඩේන් ඇලමෝ

3

නාම අවකාශයේ RestSharp.Extensions කියවීමේ ක්‍රමය ReadAsBytes ඇත. මෙම ක්‍රමය ඇතුළත MemoryStream භාවිතා කරන අතර මෙම පිටුවේ සමහර උදාහරණ වල මෙන් එකම කේතයක් ඇත, නමුත් ඔබ RestSharp භාවිතා කරන විට මෙය පහසුම ක්‍රමයයි.

using RestSharp.Extensions;
var byteArray = inputStream.ReadAsBytes();

2

උපකාරක පන්තියක් සාදන්න සහ ඔබ එය භාවිතා කිරීමට කැමති ඕනෑම තැනක එය යොමු කරන්න.

public static class StreamHelpers
{
    public static byte[] ReadFully(this Stream input)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            input.CopyTo(ms);
            return ms.ToArray();
        }
    }
}

2

මෙය මා භාවිතා කරන, පරීක්ෂා කරන ලද සහ හොඳින් වැඩ කරන ශ්‍රිතයයි. කරුණාකර මතක තබා ගන්න 'ආදානය' ශුන්‍ය නොවිය යුතු අතර කියවීමට පෙර 'input.position' '0' වෙත නැවත සැකසිය යුතුය. එසේ නොවුවහොත් එය කියවීමේ ලූපය බිඳ දමනු ඇති අතර අරාව බවට පරිවර්තනය කිරීමට කිසිවක් කියවන්නේ නැත.

    public static byte[] StreamToByteArray(Stream input)
    {
        if (input == null)
            return null;
        byte[] buffer = new byte[16 * 1024];
        input.Position = 0;
        using (MemoryStream ms = new MemoryStream())
        {
            int read;
            while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
            {
                ms.Write(buffer, 0, read);
            }
            byte[] temp = ms.ToArray();

            return temp;
        }
    }

1

ඔබට මෙම දිගු කිරීමේ ක්‍රමය භාවිතා කළ හැකිය.

public static class StreamExtensions
{
    public static byte[] ToByteArray(this Stream stream)
    {
        var bytes = new List<byte>();

        int b;
        while ((b = stream.ReadByte()) != -1)
            bytes.Add((byte)b);

        return bytes.ToArray();
    }
}

-1
public static byte[] ToByteArray(Stream stream)
    {
        if (stream is MemoryStream)
        {
            return ((MemoryStream)stream).ToArray();
        }
        else
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = stream.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }            
    }

ඔබ වටිනා කිසිවක් එකතු නොකර # 1 සහ # 3 පිළිතුරෙන් කේතය පිටපත් කළා. කරුණාකර එය නොකරන්න. :)
කෝඩ්කාස්ටර්

ඔබ කේතයක් එකතු කරන විට, ඔබේ යෝජිත විසඳුමද ඉක්මනින් විස්තර කරන්න.
යකෝබොම්

-5

එය තනි පේළියකින් ක්‍රියාත්මක කිරීමට මට හැකි විය:

byte [] byteArr= ((MemoryStream)localStream).ToArray();

johnnyRose විසින් පැහැදිලි කර ඇති පරිදි , ඉහත කේතය ක්‍රියාත්මක වන්නේ MemoryStream සඳහා පමණි


2
එසේ localStreamනොවේ නම් කුමක් කළ MemoryStreamයුතුද? මෙම කේතය අසමත් වනු ඇත.
johnnyRose

localStream යනු ධාරාව පදනම් කරගත් වස්තුවක් විය යුතුය. ප්‍රවාහය පදනම් කරගත් වස්තුව පිළිබඳ වැඩි විස්තර මෙහි stackoverflow.com/questions/8156896/…
අබ්බා

1
මම යෝජනා කිරීමට උත්සාහ කළේ, ඔබ localStreama වෙතට දැමීමට උත්සාහ MemoryStreamකළත් localStreamඑය එසේ නොවේ නම් MemoryStreamඑය අසාර්ථක වනු ඇත . මෙම කේතය දඩ සම්පාදනය කරනු ඇත, නමුත් එය නියම වර්ගය අනුව ක්‍රියාත්මක වන විට අසමත් විය හැකිය localStream. ඔබට සෑම විටම අත්තනෝමතික ලෙස ළමා වර්ගයකට මූලික වර්ගයක් දැමිය නොහැක; වැඩි විස්තර මෙතැනින් කියවන්න . ඔබට මෙය සැමවිටම කළ නොහැක්කේ මන්දැයි පැහැදිලි කරන තවත් හොඳ උදාහරණයකි .
johnnyRose

මගේ ඉහත අදහස විස්තාරනය කිරීම සඳහා: සියලුම මතක ප්‍රවාහයන් ප්‍රවාහයන් වේ, නමුත් සියලුම ප්‍රවාහයන් මතක ධාරාවන් නොවේ.
johnnyRose

1
එය වැරදිය. සරල උදාහරණය: a වෙත වාත්තු කළ නොහැකි අතර මෙම දෝෂය සමඟ එය අසාර්ථක වනු ඇත: "System.IO.MemoryStream 'ටයිප් කිරීමට' System.IO.FileStream 'වර්ගයේ වස්තුවක් FileStreamදැමිය නොහැක MemoryStream." උදාහරණය: using (Stream fs = new FileStream(@"C:\pathtofile.txt", FileMode.Open)) { var memoryStream = (MemoryStream)fs; } ඔබ සරලව භාවිතා කරන්නේ නම් මෙය සම්පාදනය නොවේ var, මන්ද එය ව්‍යංගයෙන් a ට ටයිප් කරයි MemoryStream. Streamඉහත පරිදි එය ටයිප් කිරීමෙන් මා කලින් පැහැදිලි කළ පරිදි ධාවන කාල ව්‍යතිරේකයක් නිර්මාණය වේ. එය උත්සාහ කර ඔබම බලන්න.
johnnyRose
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.